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

如何获取PyTorch Cross-Entropy损失函数的N个独立损失值?

解决PyTorch Cross-Entropy返回独立损失值的问题

你遇到的问题核心是模型封装的loss函数没有正确传递reduction=None参数,导致即使你预期获取每个样本的独立损失,实际还是用了默认的reduction='mean'返回标量,进而触发切片报错。

解决步骤:

  • 检查并修改模型的loss函数实现:
    你调用的是burnIn_model.loss()而非直接使用torch.nn.functional.cross_entropy,所以需要确保模型内部的loss函数支持传入reduction参数。比如原模型的loss函数可能硬编码了聚合方式:

    def loss(self, X, Y):
        # 默认reduction='mean',返回标量
        return torch.nn.functional.cross_entropy(self(X), Y)
    

    要修改为允许指定reduction:

    def loss(self, X, Y, reduction='mean'):
        return torch.nn.functional.cross_entropy(self(X), Y, reduction=reduction)
    
  • 调用时显式指定reduction=None:
    在调用loss函数时传入参数,让其返回每个样本的独立损失:

    tMinusOne_loss = burnIn_model.loss(combined_tMinusOne_X, combined_tMinusOne_Y, reduction=None)
    
  • 验证输出形状:
    修改后,tMinusOne_loss会变成形状为(N,)的1维张量(N为样本数),而非标量,此时执行tMinusOne_loss[:len(combined_tMinusOne_X_first)]就不会报错。

额外排查点:

确保输入张量的维度符合要求:

  • combined_tMinusOne_X需为(N, C)形状(N是样本数,C是类别数)
  • combined_tMinusOne_Y需为(N,)形状的标签张量(存储类别索引,不是one-hot编码)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:12:11