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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:08