基于ANN实现多任务学习时Keras模型报错如何解决?
错误原因
- Keras 函数式API(
Model())要求输入、输出参数均为张量类型,传入Sequential模型实例会触发类型不匹配报错。 - 原代码还存在两处隐性问题:
- 预先定义的
inputs输入张量未与主共享模型关联 - 单神经元输出使用
softmax激活会恒输出1,二分类场景应替换为sigmoid,回归任务无需设置激活函数。
- 预先定义的
修复后的完整代码
import tensorflow as tf from tensorflow.keras.layers import Input, Dense, BatchNormalization, Dropout from tensorflow.keras.models import Model, Sequential # 标签拆分逻辑保留 y_train_target1 = Y_train.iloc[:, 0] y_test_target1 = Y_test.iloc[:, 0] y_train_target2 = Y_train.iloc[:, 1] y_test_target2 = Y_test.iloc[:, 1] input_dim_train = X_train.shape[1] # 定义输入张量 inputs = Input(shape=(input_dim_train,), name='main_input') # 定义共享主干网络,删除原代码中多余的末尾Dense(1, softmax)层 main_model = Sequential([ Dense(200, activation='relu', input_dim=input_dim_train), Dense(50, activation='relu'), BatchNormalization(), Dropout(0.4) ]) # 用输入张量调用主干模型,得到共享层输出张量 shared_output = main_model(inputs) # 两个任务头直接叠加在共享输出张量上,得到最终输出张量 target1_output = Dense(1, activation='sigmoid', name='target1_output')(shared_output) target2_output = Dense(1, activation='sigmoid', name='target2_output')(shared_output) # 传入输入、输出张量构建多任务模型 model_share = Model(inputs=inputs, outputs=[target1_output, target2_output]) model_share.summary()
后续编译注意事项
编译多任务模型时需要为两个输出分别指定损失函数,也可自定义不同任务的损失权重:
model_share.compile( optimizer='adam', loss={ 'target1_output': 'binary_crossentropy', 'target2_output': 'binary_crossentropy' }, loss_weights={ 'target1_output': 0.5, 'target2_output': 0.5 }, metrics=['accuracy'] ) # 训练时传入对应顺序的两个标签数组即可 model_share.fit(X_train, [y_train_target1, y_train_target2], epochs=10, batch_size=32, validation_data=(X_test, [y_test_target1, y_test_target2]))
内容的提问来源于stack exchange,提问作者jeny ericsoon
相关产品推荐
相关产品推荐

