Keras双输入模型运行model.fit方法报错的原因及解决方法咨询
报错触发原因
该错误核心由计算图连通性问题导致,常见触发场景有三类:
- 直接复用独立构建的
autoencoder实例处理两个输入时,该实例在之前的构建流程中已经绑定了专属输入层,跨模型调用时Keras无法正确追踪input1/input2到最终输出的反向传播路径,出现计算图断裂。 - 输入层写法不规范:低版本Keras中
Input(85)会被识别为batch_size=85而非输入特征维度,导致模型输入形状和训练数据形状不匹配。 - 若使用预训练自编码器做特征提取,未冻结自编码器权重时,多输入复用同一模型的场景下可能出现梯度计算冲突。
修复方案
场景A:仅使用自编码器做特征提取,不需要微调自编码器权重(绝大多数场景适用)
- 先单独从完整自编码器中提取编码器部分,冻结权重避免训练时更新:
# 请替换'encoder_output_layer_name'为你自编码器中编码层的实际名称 encoder = keras.Model( inputs=autoencoder.input, outputs=autoencoder.get_layer('encoder_output_layer_name').output ) encoder.trainable = False
- 修正模型构建代码,显式指定输入形状:
input1 = keras.layers.Input(shape=(85,)) input2 = keras.layers.Input(shape=(85,)) encoder1 = encoder(input1) encoder2 = encoder(input2) connector = keras.layers.Concatenate(axis=1)([encoder1, encoder2]) layer1 = keras.layers.Dense(24, activation='relu')(connector) model = keras.Model(inputs=[input1, input2], outputs=layer1)
- 重新编译模型后再调用
fit方法训练即可。
场景B:需要同步微调自编码器权重和下游层权重
仅需去掉上述步骤中encoder.trainable = False的配置即可,若仍报错可直接在当前计算图中重新实例化编码器结构,加载预训练权重后再复用,避免跨计算图调用问题。
内容的提问来源于stack exchange,提问作者Edenz
相关产品推荐
相关产品推荐

