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

如何在PyTorch的CrossEntropyLoss中为批量样本设置不同权重?

如何为批量中每个样本的CrossEntropyLoss损失单独加权?

我知道torch.nn.CrossEntropyLoss会为批量里的每个样本计算损失值,再求和得到最终损失。现在想在求和前,把批量中3个样本的损失分别和数组multiplier里的对应元素相乘,该怎么实现?

注意:这个函数的weight参数是对不同目标类别加权,不是我要的效果。

示例代码:

import torch
import numpy as np
multiplier = torch.from_numpy(np.array([1.0, -2.0, 5.0]))
source = torch.from_numpy(
    np.array([[0.5, -0.6],
              [-3.0, -2.0],
              [-4.0, 2.3]]))
target = torch.from_numpy(np.array([0, 1, 0]))
loss_fn = torch.nn.CrossEntropyLoss()
loss_fn(source, target)

解决方案

通过设置CrossEntropyLoss的reduction='none',可以获取每个样本单独的损失值,之后再和multiplier逐元素相乘并求和即可:

import torch
import numpy as np

multiplier = torch.from_numpy(np.array([1.0, -2.0, 5.0]))
source = torch.from_numpy(
    np.array([[0.5, -0.6],
              [-3.0, -2.0],
              [-4.0, 2.3]]))
target = torch.from_numpy(np.array([0, 1, 0]))

# 配置损失函数为返回每个样本的损失,不自动求和/平均
loss_fn = torch.nn.CrossEntropyLoss(reduction='none')
per_sample_loss = loss_fn(source, target)
# 对每个样本损失加权后求和
weighted_loss = (per_sample_loss * multiplier).sum()

print(weighted_loss)

说明

  • reduction='none':让损失函数输出与批量大小一致的张量,每个元素对应单个样本的损失,而非直接输出求和或平均后的总损失。
  • 逐元素乘法后调用.sum(),就能得到每个样本损失按对应权重加权后的总和,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:12:48