PyTorch训练二分类MLP模型始终预测0、训练失效问题求助
问题产生原因
- 预测逻辑错误:模型最后一层是Sigmoid,输出是介于0~1之间的概率值,直接调用
to(torch.long)会对浮点值做截断取整,只要输出值小于1(不管是0.1还是0.9),转换后都会变成0,这是得到全0预测结果最直接的原因。 - 数据集无学习价值:当前的输入特征
X是均匀随机生成的,标签y也是随机生成的,输入和标签之间没有任何对应关系,模型无法学到有效分类规律,最优的收敛结果就是直接预测占比更高的类别,若训练集中0类占比略高,就会出现全0预测的情况,准确率最高只能接近随机猜测的50%。 - 其他次要原因:训练轮次不足、学习率设置不合理也可能导致模型收敛差,但不是当前问题的核心诱因。
解决方案
- 修正预测逻辑:增加阈值判断,将概率值转换为类别标签,示例修改代码如下:
with torch.no_grad(): predictions = model(X_train) # 加阈值判断,大于等于0.5判为1,否则为0 predictions = (predictions >= 0.5).to(torch.long) y_pred = predictions.numpy() y_true = y_train.numpy()
- 替换为可学习的数据集:构造输入特征和标签有对应关系的数据集,示例构造代码如下:
# 示例规则:3个特征的和大于1.5时标签为1,否则为0 X_train = torch.rand((200, 3),dtype=torch.float32) y_train = (X_train.sum(dim=1, keepdim=True) > 1.5).float() X_test = torch.rand((100, 3),dtype=torch.float32) y_test = (X_test.sum(dim=1, keepdim=True) > 1.5).float()
- 优化训练配置:可根据实际情况将训练轮次提升到200~500轮,也可显式设置Adam优化器的学习率(默认1e-3适配大多数场景,也可尝试1e-4、5e-4等参数),训练过程中定期打印损失值,确认损失处于下降趋势。
内容的提问来源于stack exchange,提问作者Katja
相关产品推荐
相关产品推荐

