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

Keras中Wide&Deep模型合并报错求助:Merge层弃用如何拼接?

正确在Keras中构建Wide&Deep模型的方法

你遇到的问题根源有两个:一是旧的Merge层已经被弃用,二是Sequential模型本身是线性堆叠结构,没法直接处理多分支合并的逻辑——Keras里这类需要分支、合并的模型,最适合用函数式API来构建,这也是官方推荐的方式。

咱们直接把你的代码改成正确的版本,一步步看:

步骤1:保留你的Wide和Deep分支(可继续用Sequential)

你原来定义的Wide和Deep分支是没问题的,不用修改:

from keras.models import Sequential
from keras.layers import Dense, concatenate
from keras.models import Model

# Wide分支
wide = Sequential()
wide.add(Dense(1, input_dim=X_train.shape[1], kernel_initializer='uniform', activation='relu'))

# Deep分支
deep = Sequential()
deep.add(Dense(1, input_dim=X_train.shape[1], kernel_initializer='uniform', activation='relu'))
deep.add(Dense(100, activation='relu'))
deep.add(Dense(50, activation='relu'))
deep.add(Dense(1, activation='linear'))

步骤2:用函数式API合并分支

接下来,我们需要获取两个分支的输出,然后用concatenate层(替代旧的Merge)把它们拼接起来,最后构建完整模型:

# 获取两个分支的输出
wide_output = wide.output
deep_output = deep.output

# 拼接两个分支的输出(对应你原来的mode='concat')
combined = concatenate([wide_output, deep_output])

# 添加最终的输出层
final_output = Dense(1, activation='linear')(combined)

# 定义完整模型:输入是两个分支的输入,输出是最终输出
model = Model(inputs=[wide.input, deep.input], outputs=final_output)

步骤3:编译与训练

最后,编译模型并训练的时候,注意输入要传入两个分支对应的训练数据(如果你的Wide和Deep用的是同一组输入X_train,那训练时传入[X_train, X_train]就行):

model.compile(optimizer='adam', loss='mse')
model.fit([X_train, X_train], y_train, epochs=10, batch_size=32)

为什么你之前的尝试报错?

你之前写的model.add([wide, deep])报错,是因为Sequential模型的add方法只能接受单个Layer实例,而你传入的是两个Sequential模型的列表,这不符合Sequential的线性堆叠逻辑——函数式API才是为这类多分支场景设计的。

额外优化:统一用函数式API写分支

如果你不想混用Sequential和函数式API,也可以直接用函数式API从头到尾定义所有分支,代码更简洁(因为Wide和Deep共用同一输入层,训练时只需传入一次X_train):

from keras.layers import Input, Dense, concatenate
from keras.models import Model

# 定义共用的输入层
input_layer = Input(shape=(X_train.shape[1],))

# Wide分支
wide_branch = Dense(1, kernel_initializer='uniform', activation='relu')(input_layer)

# Deep分支
deep_branch = Dense(1, kernel_initializer='uniform', activation='relu')(input_layer)
deep_branch = Dense(100, activation='relu')(deep_branch)
deep_branch = Dense(50, activation='relu')(deep_branch)
deep_branch = Dense(1, activation='linear')(deep_branch)

# 拼接分支
combined = concatenate([wide_branch, deep_branch])
final_output = Dense(1, activation='linear')(combined)

# 定义模型
model = Model(inputs=input_layer, outputs=final_output)

# 编译训练
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=10, batch_size=32)

内容的提问来源于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:19:43