PyTorch CrossEntropyLoss报错:RuntimeError:多值张量布尔值歧义
问题原因及修正方案
错误的核心在于CrossEntropyLoss的使用方式:你直接把预测结果和目标作为参数传入了损失类的构造函数,而PyTorch中损失函数的正确用法是先实例化损失对象,再调用该对象传入参数计算损失。
修正后的代码如下:
# 压缩维度,去掉多余的1 predictions_squeezed = cls_scores.squeeze(1) # 从独热编码转成类别索引 targets = torch.argmax(targets.squeeze(1), dim=1) # 先实例化损失函数(可按需指定weight等参数,此处用默认配置) criterion = torch.nn.CrossEntropyLoss() # 调用实例计算损失 losses = criterion(predictions_squeezed, targets)
补充说明:
- CrossEntropyLoss类的
__init__方法用于配置损失的规则(比如类别权重、是否忽略特定类别等),并非直接计算损失;实际计算逻辑是通过类的__call__方法实现的,也就是实例化后像调用函数一样传入参数。 - 你对预测结果的维度压缩、从独热编码转换为类别索引的逻辑是正确的,这部分无需调整。
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

