IRIS数据集二分类场景下1D CNN准确率极低问题求助
IRIS二分类CNN任务准确率低、波动大的排查优化方案
- 训练轮次严重不足:当前仅设置
epochs=2,模型还未完成有效特征学习就停止训练,是效果差的核心原因之一。IRIS二分类任务建议先将训练轮次调整到20~50区间,观察损失下降收敛趋势后再做调优。 - 损失函数与输出逻辑不匹配:你使用了
nn.NLLLoss()负对数似然损失,但模型输出没有经过LogSoftmax激活,直接拼接x和1-x的操作完全不符合NLLLoss的输入要求,损失计算逻辑错误。两种修正方案可选:- 输出层添加
F.log_softmax激活:return F.log_softmax(T.cat((x, 1 - x), -1), dim=1) - 改为更适配二分类的实现:输出单值,损失替换为
nn.BCEWithLogitsLoss(),逻辑更简洁。
- 输出层添加
- 数据处理逻辑错误:
- 标准化顺序错误:当前在Dataset初始化时先对全量
trainX做标准化,之后才过滤0、1两类标签,标准化统计量包含了被丢弃的第三类样本数据,不符合处理规范。应该先过滤标签,再对保留的训练数据拟合StandardScaler。 - 测试集标准化逻辑错误:测试集不能单独fit StandardScaler,必须复用训练集拟合好的scaler实例做transform,否则会出现数据分布偏移。
- 批次大小设置不合理:
batch_size=1会导致训练过程梯度波动极大,建议调整为8~16的小批次。
- 标准化顺序错误:当前在Dataset初始化时先对全量
- 模型架构适配问题:
- 卷积参数无实际作用:IRIS是4维表格数据,你用
kernel_size=1的1D卷积等效于全连接层,完全没有发挥卷积的特征提取价值。如果一定要用CNN,可以将kernel_size调整为2,同时确保输入维度匹配。 - Dropout选型错误:
nn.Dropout2d()是针对2D图像特征设计的dropout,1D数据应该使用nn.Dropout(),小样本任务建议先去掉dropout,或者设置dropout率为0.1即可。
- 卷积参数无实际作用:IRIS是4维表格数据,你用
- 训练逻辑冗余&可复现性问题:
- 训练循环中重复将
Y_tr转成torch.long类型,完全可以在Dataset初始化时直接把标签转为long类型,避免重复操作;X_tr.unsqueeze(0)的维度调整也可以放到__getitem__中统一处理,避免训练循环维度混乱。 - 结果波动大主要是未固定随机种子导致的,需要给numpy、PyTorch、CUDA(若使用GPU)都固定随机种子,同时如果Dataloader开启多worker也要固定worker种子,保证每次运行的初始化、数据打乱逻辑一致。
- 训练循环中重复将
- 验证逻辑参考性不足:二分类IRIS总共只有100个样本,9:1拆分后测试集仅10个样本,单次拆分的准确率统计误差极大,建议改用5折交叉验证来评估模型效果,结果更稳定。
内容的提问来源于stack exchange,提问作者user14924
相关产品推荐
相关产品推荐

