PyTorch使用CrossEntropyLoss报错:输出与标签维度不匹配
多分类模型损失函数报错问题解决
问题概述
在使用PyTorch开发多分类模型时,采用nn.CrossEntropyLoss()作为损失函数,模型输出尺寸为(batchsize, #classes),但运行时出现尺寸不匹配的报错,同时疑惑CrossEntropyLoss是否自动应用LogSoftmax。
错误原因分析
从报错信息和代码来看,存在两个核心问题:
- 标签数据类型错误:
nn.CrossEntropyLoss()要求标签为**整数类型(torch.long)**的类别索引,但当前Dataset中标签被转为torch.float32类型。 - 损失函数调用异常:报错栈显示实际调用的是
BCEWithLogitsLoss(二分类损失),但代码中定义的是nn.CrossEntropyLoss(),可能存在代码混淆或误改情况。
另外需要明确:nn.CrossEntropyLoss()的输入要求是模型输出未经过Softmax的logits(形状[batch_size, num_classes]),标签是类别索引(形状[batch_size]),该损失函数内部会自动完成LogSoftmax和NLLLoss的计算,因此模型输出(batchsize, #classes)是完全正确的,不需要改成(batchsize)的向量。
具体修复步骤
修正Dataset中的标签类型:修改
DatasetPlus的__getitem__方法中标签的转换代码:# 原代码 label = torch.tensor(label, dtype=torch.float32) # 修改为 label = torch.tensor(label, dtype=torch.long)确认损失函数定义正确:确保训练代码中损失函数确实是多分类用的
CrossEntropyLoss,而非二分类损失:criterion = nn.CrossEntropyLoss() # 确认这一行没有被误改为BCE相关损失验证输入输出尺寸:修正后,模型输出
yhat尺寸为[4, 3](batch=4,3个类别),标签label尺寸为[4](每个样本对应一个类别索引),符合nn.CrossEntropyLoss()的输入要求,此时损失计算不会再报尺寸不匹配错误。
修复后训练流程说明
模型的输出逻辑无需修改,nn.CrossEntropyLoss()会自动处理logits与类别索引的损失计算,训练代码保持原有结构即可正常运行。
内容的提问来源于stack exchange,提问作者Mohsen Amiri
相关产品推荐
相关产品推荐

