二分类任务中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,输出对应两个类别的对数概率:
标签要求和CrossEntropyLoss一致,为形状x = self.wave_block6(x) x = torch.nn.functional.log_softmax(self.fc(x), dim=1) return x[64]的类别索引张量。
内容的提问来源于stack exchange,提问作者dorien
相关产品推荐
相关产品推荐

