Python 在Keras函数API中合并两个模型

Python 在Keras函数API中合并两个模型,python,tensorflow,keras,Python,Tensorflow,Keras,我在广泛而深入的模型中游手好闲,试图用keras实现一些基本的东西。我能够使用功能性keras生成一个简单的模型和一个深度nn。然而,我有一些问题混淆了两者 ############################################################################### ############################################################################### inputs = I

我在广泛而深入的模型中游手好闲,试图用keras实现一些基本的东西。我能够使用功能性keras生成一个简单的模型和一个深度nn。然而,我有一些问题混淆了两者

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

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.
ValueError:调用Layer dense_36时使用的输入不是符号张量。收到的类型:。完整输入:[]。层的所有输入都应该是张量。

A
串联
层的工作原理与其他层完全相同

  • 第一个括号中的图层参数(图层创建)
  • 在第二个括号中输入张量(调用层以获得输出)
  • 输入必须是张量,而不是模型
因此:

合并模型必须从最初的两个输入开始:

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
返回列表,而不是tensor

如果像层一样调用模型以获得相应的输出
wide(inputs)
而不是
。outputs
不确定是否“更真实”,但这确实是一种常见的标准方法,但是,这会创建更多节点,如果以后要派生更多模型、尝试自定义函数等,可能需要额外注意。///另一方面,如果您希望两个模型串联在一起,但又可以选择分别使用它们,您的建议是最好的选择。
merge = Concatenate()([wide.output,deep.output])
model = Model(inputs=[wide.input,deep.input], outputs=output)