You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Keras Functional API中合并Wide&Deep模型?

解决Keras中Wide&Deep模型集成的拼接问题

嗨,我来帮你搞定这个拼接出错的问题!你现在遇到的ValueError核心原因是用错了Concatenate层的使用方式——你直接把wide和deep这两个模型对象传给了Concatenate,但这个层需要的是模型输出的张量,而不是模型本身。另外你代码里最后一行的visible变量也没定义,这也是个小问题。

先给你理清楚正确的集成思路:Wide&Deep模型的核心是同时利用线性模型的记忆能力和深度网络的泛化能力,通常我们会共享同一个输入特征,分别构建Wide和Deep分支,然后把两个分支的输出张量拼接起来,再构建最终的输出层。如果需要预训练分支,也可以先单独训练,之后再复用权重来集成。

修正后的完整代码(共享输入+直接集成)

from tensorflow.keras.layers import Input, Dense, Concatenate
from tensorflow.keras.models import Model

# 1. 定义共享的输入层(所有分支都用这个输入)
inputs = Input(shape=(X_train.shape[1],))

# 2. 构建Wide分支(线性模型,保留记忆性)
wide_output = Dense(1, activation='linear')(inputs)
# 如果你需要预训练Wide分支,可以单独构建模型训练:
# wide_model = Model(inputs, wide_output)
# wide_model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
# wide_model.fit(X_train, Y_train, epochs=10, verbose=1)

# 3. 构建Deep分支(深度网络,负责泛化)
x = Dense(200, kernel_initializer='uniform', activation='relu')(inputs)
x = Dense(100, activation='relu')(x)
x = Dense(50, activation='relu')(x)
deep_output = Dense(1, activation='sigmoid')(x)
# 同样,预训练Deep分支的话:
# deep_model = Model(inputs, deep_output)
# deep_model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
# deep_model.fit(X_train, Y_train, epochs=10, verbose=1)

# 4. 关键:拼接两个分支的输出张量(注意这里的用法!)
# 方式一:用Concatenate层实例化后调用
merged = Concatenate()([wide_output, deep_output])
# 方式二:用更简洁的concatenate函数(小写)
# merged = tf.keras.layers.concatenate([wide_output, deep_output])

# 5. 构建最终的融合层和输出层
hidden1 = Dense(10, activation='relu')(merged)
final_output = Dense(1, activation='sigmoid')(hidden1)

# 6. 定义完整的Wide&Deep模型并训练
model = Model(inputs=inputs, outputs=final_output)
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
model.fit(X_train, Y_train, epochs=10, verbose=1)

如果已经单独训练好了Wide和Deep模型,怎么复用权重集成?

如果你已经像原来代码那样单独训练完了wide和deep模型,只需要获取它们的输出张量来拼接就行,代码如下:

# 假设已经训练好wide和deep模型
merged = Concatenate()([wide.output, deep.output])
hidden1 = Dense(10, activation='relu')(merged)
final_output = Dense(1, activation='sigmoid')(hidden1)

# 这里输入用wide.input(因为两个模型共享同一个输入形状)
model = Model(inputs=wide.input, outputs=final_output)
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
model.fit(X_train, Y_train, epochs=10, verbose=1)

再强调几个易错点

  • 不要直接把模型对象传给Concatenate层,一定要传模型的输出张量(比如wide.output或者分支最后一层的输出)
  • Concatenate()是层的类,需要先实例化(加括号),再调用传入张量;而小写的concatenate()是函数,可以直接传张量列表
  • 确保所有分支的输入一致,或者根据你的需求定义不同的输入层(比如Wide用稀疏特征,Deep用稠密特征)

内容的提问来源于stack exchange,提问作者AGUY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:13