Quora问题对BERT二分类BCELoss输入输出维度不匹配报错如何修复
问题根因与修复方案
报错的核心触发原因是你强制将输入张量reshape为固定批大小16的维度,覆盖了DataLoader的动态批大小逻辑:数据集最后一个批次的样本量不足16时,标签维度只有[2,1],但你把输入强行reshape成了[16, seq_len],导致模型输出维度为[16,1],二者维度不匹配。同时你的二分类逻辑也存在多处搭配错误,一并修复如下:
删掉强制reshape输入维度的两行代码
这两行代码破坏了动态批次的维度一致性,DataLoader返回的input_ids和attention_mask本身已经是[当前批次大小, 序列长度]的合法维度,不需要额外调整:# 删掉以下两行 input_ids = input_ids.view(BATCH_SIZE,-1) attention_mask = attention_mask.view(BATCH_SIZE,-1)调整损失函数与激活函数的搭配
你当前输出层为1维二分类结构,使用Softmax激活搭配BCELoss是错误的:1维张量的Softmax输出永远为1,无法区分正负类别。推荐直接替换为数值稳定性更好的BCEWithLogitsLoss,内置Sigmoid激活,无需手动加激活层:# 替换损失函数定义 loss_fn = nn.BCEWithLogitsLoss().to(device)修正损失计算与预测逻辑
对应损失函数的修改,调整损失计算和预测的代码段:# 原softmax+max的逻辑删除,替换为以下内容 preds = (torch.sigmoid(outputs) >= 0.5).long() targets = targets.unsqueeze(-1).float() loss = loss_fn(outputs, targets)可选兼容方案:如果坚持使用
BCELoss,则修改损失计算逻辑为:outputs = torch.sigmoid(outputs) preds = (outputs >= 0.5).long() targets = targets.unsqueeze(-1).float() loss = loss_fn(outputs, targets)
内容的提问来源于stack exchange,提问作者user14880913
相关产品推荐
相关产品推荐

