Объединение двух моделей в Keras Functional API

Я возился с широкими и глубокими моделями и пытаюсь реализовать что-то базовое с помощью keras. Я могу создать простую модель и глубокую нн, используя функциональные керасы. Однако у меня есть некоторые проблемы с объединением этих двух.

###############################################################################
###############################################################################

inputs = Input(shape = (X_train.shape[1],))
output = Dense(1, activation='linear')(inputs)
wide = Model(inputs, output)

wide.compile(
        optimizer = 'adam',
        loss = 'mean_squared_error',
        metrics = ['accuracy']
)

wide.fit(x = X_train, y = Y_train, epochs = 10, verbose = 1)

###############################################################################
###############################################################################

inputs = Input(shape = (X_train.shape[1],))
x = Dense(200, kernel_initializer = 'uniform', 
               activation = 'relu')(inputs)
x = Dense(100, activation = 'relu')(x)
x = Dense(50, activation = 'relu')(x)
output = Dense(1, activation='sigmoid')(x)
deep = Model(inputs, output)

deep.compile(
        optimizer = 'adam',
        loss = 'mean_squared_error',
        metrics = ['accuracy']
)

deep.fit(x = X_train, y = Y_train, epochs = 10, verbose = 1)

###############################################################################
###############################################################################

merge = Concatenate([wide, deep])
    hidden1 = Dense(10, activation='relu')(merge)
    output = Dense(1, activation='sigmoid')(hidden1)
    model = Model(inputs=visible, outputs=output) 

Как я могу объединить две модели?

Я получаю такую ​​ошибку:

ValueError: Layer dense_36 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.layers.merge.Concatenate'>. Full input: [<keras.layers.merge.Concatenate object at 0x1a1adda588>]. All inputs to the layer should be tensors.
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 897
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Слой Concatenate работает точно так же, как и другие.

  • Параметры слоя в первых скобках (создание слоя)
  • Входные тензоры во вторых скобках (вызов слоя для получения выходных данных)
  • Входные данные должны быть тензорами, а не моделями.

Так:

merge = Concatenate()([wide.outputs,deep.outputs])

Объединенная модель должна начинаться с самых первых двух входов:

model = Model(inputs=[wide.inputs,deep.inputs], outputs=output)

Было бы более верно для API, если бы модели вызывались как слои для получения соответствующих выходных данных wide(inputs), а не .outputs.

nuric 18.05.2018 18:29

Не уверен, что «вернее», но это действительно обычный стандартный метод, но он создает больше узлов и может потребовать дополнительного внимания позже, если вы собираетесь создать больше моделей, попробовать пользовательские функции и т. д. /// С другой стороны , если вы хотите, чтобы две модели были включены в серию, но при этом у вас есть возможность использовать их по отдельности, ваше предложение - лучший вариант.

Daniel Möller 18.05.2018 18:32

keras 2.1 и выше:

merge = Concatenate()([wide.output,deep.output])
model = Model(inputs=[wide.input,deep.input], outputs=output)

потому что .outputs и .input возвращают список, а не тензор

Другие вопросы по теме