Keras多输入神经网络合并输入层时报layers无output属性如何解决
报错核心原因
layers do not have an attribute output 报错的本质是你混淆了Keras的层实例和输出张量两个概念:.output是tf.keras.Model实例才有的属性,普通的层运算返回的张量本身就代表输出结果,不需要额外调用.output属性。
正确写法
根据你代码的写法不同,分两种常见场景调整即可:
场景1:x1、x2为前序层的输出张量
这是绝大多数多输入网络的常规写法,你直接把两个输出张量传入拼接函数即可,不需要取.output:
# 第一步:定义两个输入头 input1 = tf.keras.Input(shape=(32,)) # 替换为你的输入1的实际形状 input2 = tf.keras.Input(shape=(128,)) # 替换为你的输入2的实际形状 # 输入1对应的分支网络 x1 = tf.keras.layers.Dense(16, activation='relu')(input1) x1 = tf.keras.layers.Dense(8, activation='relu')(x1) # x1是该分支的输出张量 # 输入2对应的分支网络 x2 = tf.keras.layers.Dense(32, activation='relu')(input2) x2 = tf.keras.layers.Dense(8, activation='relu')(x2) # x2是该分支的输出张量 # 直接拼接两个输出张量 combined = tf.keras.layers.concatenate([x1, x2]) # 后续接你的分类/回归输出层 output = tf.keras.layers.Dense(1, activation='sigmoid')(combined) # 定义完整的多输入模型 model = tf.keras.Model(inputs=[input1, input2], outputs=output)
场景2:x1、x2是预先定义的层实例
如果你是提前定义了层实例,需要先给层传入输入张量得到输出结果后再拼接:
# 预先定义层实例 x1_layer = tf.keras.layers.Dense(8, activation='relu') x2_layer = tf.keras.layers.Dense(8, activation='relu') # 给层传入对应输入,得到输出张量 input1 = tf.keras.Input(shape=(32,)) x1 = x1_layer(input1) input2 = tf.keras.Input(shape=(128,)) x2 = x2_layer(input2) # 拼接输出张量 combined = tf.keras.layers.concatenate([x1, x2])
注意事项
- 拼接前要确保两个张量除了拼接维度之外,其他维度完全匹配,比如两个张量形状都是
(None, 8),默认在最后一维拼接后得到的形状为(None, 16) - 如果需要调整拼接的维度,可以传入
axis参数指定,示例:tf.keras.layers.concatenate([x1, x2], axis=1)
内容的提问来源于stack exchange,提问作者James Pack
相关产品推荐
相关产品推荐

