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

基于ANN实现多任务学习时Keras模型报错如何解决?

错误原因

  • Keras 函数式API(Model())要求输入、输出参数均为张量类型,传入Sequential模型实例会触发类型不匹配报错。
  • 原代码还存在两处隐性问题:
    1. 预先定义的inputs输入张量未与主共享模型关联
    2. 单神经元输出使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:24:04