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

二分类任务中BCELoss与模型输出维度不匹配报错咨询

问题根因

你判断的没错,报错本质就是模型输出维度和BCELoss要求的输入维度不匹配。
BCELoss要求输入的预测值和标签的维度完全一致:当你做单标签二分类任务用BCELoss时,预测值应当是每个样本对应1个0~1之间的概率值(表示属于正类的概率),对应维度应为[batch_size, 1]或者[batch_size]。而你当前模型的输出维度是[64, 2],标签维度是[64, 1],维度不一致直接触发报错,移除squeeze解决不了核心问题。

两种适配方案,根据你的需求二选一即可

方案1:保留BCELoss,调整模型输出维度

把最后一层全连接层fc的输出神经元数从2改为1,保证模型输出维度为[64, 1],和标签维度匹配即可。
对应模型尾部可调整为:

x = self.wave_block6(x)
x = self.sigmoid(self.fc(x)) # fc输出神经元为1,输出形状[64,1]
# 若你的标签是形状为[64]的一维张量,再加squeeze,否则不需要
return x

损失函数仍使用torch.nn.BCELoss()即可。

方案2:保留fc层2维输出,更换匹配的损失函数

如果你需要输出2个值分别对应两个类别的预测概率,不用BCELoss,改用两类损失即可:

  • 选择1:交叉熵损失torch.nn.CrossEntropyLoss()
    这个损失内置了Softmax计算,所以模型尾部不需要加sigmoid,直接返回fc层输出即可:
    x = self.wave_block6(x)
    x = self.fc(x) # 输出形状[64,2]
    return x
    
    注意对应标签需要是形状为[64]的一维张量,每个元素取值为0或1表示类别索引。
  • 选择2:负对数似然损失torch.nn.NLLLoss()
    模型尾部把sigmoid换成log_softmax,输出对应两个类别的对数概率:
    x = self.wave_block6(x)
    x = torch.nn.functional.log_softmax(self.fc(x), dim=1)
    return x
    
    标签要求和CrossEntropyLoss一致,为形状[64]的类别索引张量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:15:06