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
相关产品推荐
相关产品推荐

