如何将两个Keras自编码器的输出连接到同一层并解决TypeError报错
报错原因
你抛出TypeError: 'NoneType' object is not subscriptable的核心问题是:Concatenate层要求传入的是层的输出张量,而你直接传入了层对象本身。autoencoder1.layers[2]是Dense层对象,不是该层的输出张量,Keras计算图构建时无法识别层对象作为输入,因此抛出空对象下标错误。
正确实现方案
- 首先分别获取两个自编码器的输入和输出张量,再做拼接:
# 取出两个自编码器的输入层、编码输出张量 input1 = autoencoder1.input encode_output1 = autoencoder1.layers[2].output input2 = autoencoder2.input encode_output2 = autoencoder2.layers[2].output # 拼接两个编码输出张量 concat_output = keras.layers.Concatenate()([encode_output1, encode_output2]) # 后续接自定义层,示例如下,可按需求调整 final_output = keras.layers.Dense(16, activation='relu')(concat_output) # ... 其他后续层代码 # 构建完整的多输入模型 combined_model = keras.Model(inputs=[input1, input2], outputs=final_output)
- 模型训练和推理时,按顺序传入两路输入数据即可:
# 示例训练调用,x1对应autoencoder1的输入数据,x2对应autoencoder2的输入数据 combined_model.fit([x1, x2], y_label, epochs=10, batch_size=32)
可选配置
如果后续训练时需要固定自编码器的权重不更新,可以添加如下代码:
for layer in autoencoder1.layers: layer.trainable = False for layer in autoencoder2.layers: layer.trainable = False
注:你的两个自编码器编码输出维度均为(None, 36),默认Concatenate在最后一维拼接后会得到(None, 72)的张量,符合计算要求,无需额外调整拼接维度参数。
内容的提问来源于stack exchange,提问作者Noam Patai
相关产品推荐
相关产品推荐

