如何获取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
相关产品推荐
相关产品推荐

