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

TensorFlow多输出模型如何通过Keras API调整指定样本的梯度权重

实现方案

完全可以通过Keras原生API实现你的需求,无需维护复杂的自定义训练循环,具体方案如下:

核心原理

Keras的model.fit()内置支持样本级加权机制,训练时会自动将每个样本的损失乘以对应权重再反向传播,和你自定义训练循环的预期逻辑完全一致。

具体实现步骤

  • 第一步:拆分你的标注数据,将原y数组拆分为真实标签、样本权重两部分:
    y_true = y[:, 0] # 准确的标注值
    sample_weights = y[:, 1] # 预先计算好的样本权重
    
  • 第二步:直接用model.fit()训练,两种传入权重的方式可选:
    1. 手动传入sample_weight参数:
    model.fit(
        x_train, 
        y_true, 
        sample_weight=sample_weights,
        epochs=你的训练轮数,
        batch_size=你的批次大小
    )
    
    1. 如果你用tf.data.Dataset构建数据集,直接将权重作为第三个元素加入数据集即可:
    train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_true, sample_weights)).batch(batch_size)
    model.fit(train_dataset, epochs=你的训练轮数)
    

多输出场景适配

如果你需要给两个输出头(y0/y1)设置全局的损失权重,可在模型编译时通过loss_weights参数指定,和样本加权可以叠加生效。如果部分样本的y1标注完全不可靠,直接将对应样本的y1损失权重设为0即可,Keras会自动忽略这部分无效标注的梯度更新:

model.compile(
    optimizer=optimizer,
    # 两个输出头分别对应的损失函数
    loss=[loss_fn_y0, loss_fn_y1],
    # 两个输出头的全局损失权重,可根据标注可靠性调整
    loss_weights=[1.0, 0.2]
)

原自定义训练循环的异常原因

你贴出的代码存在两个明显问题:

  1. 语法错误:loss_2_train.update_state(y_true[:, 1], loss_value[:,1) 中右括号不匹配,少了]
  2. 维度错误:你已经通过y_true = y[:, 0]提取了第一列作为真实标签,此时y_true是一维数组,后续更新指标时调用y_true[:, 0]/y_true[:, 1]会触发维度不匹配报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:27:03