Я возился с широкими и глубокими моделями и пытаюсь реализовать что-то базовое с помощью 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.






Слой Concatenate работает точно так же, как и другие.
Так:
merge = Concatenate()([wide.outputs,deep.outputs])
Объединенная модель должна начинаться с самых первых двух входов:
model = Model(inputs=[wide.inputs,deep.inputs], outputs=output)
Не уверен, что «вернее», но это действительно обычный стандартный метод, но он создает больше узлов и может потребовать дополнительного внимания позже, если вы собираетесь создать больше моделей, попробовать пользовательские функции и т. д. /// С другой стороны , если вы хотите, чтобы две модели были включены в серию, но при этом у вас есть возможность использовать их по отдельности, ваше предложение - лучший вариант.
keras 2.1 и выше:
merge = Concatenate()([wide.output,deep.output])
model = Model(inputs=[wide.input,deep.input], outputs=output)
потому что .outputs и .input возвращают список, а не тензор
Было бы более верно для API, если бы модели вызывались как слои для получения соответствующих выходных данных
wide(inputs), а не.outputs.