基于PyTorch优化水果分类CNN模型准确率及过拟合问题的技术问询
三类水果图像分类任务优化方案
1 解决shape不匹配报错
你遇到的shape报错和加weight_decay本身无关,核心原因是代码编写顺序错误:你在定义ConvolutionalNetwork类、实例化CNNmodel之前就先定义了optimizer,导致optimizer绑定的是旧版本的模型参数,修改模型结构或新增正则项后参数维度不匹配就会触发报错。
修正方案:
- 调整代码顺序:先定义模型类,再实例化
CNNmodel,最后再定义optimizer,加weight_decay的写法参考:optimizer = torch.optim.Adam(CNNmodel.parameters(), lr=0.001, weight_decay=1e-4) - 可以在forward方法中两次池化操作后打印张量维度:
print(X.shape),确认输出维度和全连接层fc1的输入维度54*54*16匹配,避免后续修改输入尺寸后维度不兼容。
2 解决过拟合问题
当前训练集准确率85%、测试集仅60%属于典型的过拟合,可通过以下手段优化:
- 强化数据增强策略:现有训练增强规则太弱,可在
train_transform中新增色彩抖动、随机裁剪等操作,示例补充代码:
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1), transforms.RandomResizedCrop(224, scale=(0.8, 1.0)), transforms.GaussianBlur(kernel_size=(3,3), sigma=(0.1, 2.0))
- 新增正则化项:在模型的全连接层之间加入Dropout层,示例修改:
# __init__中新增 self.dropout = nn.Dropout(0.5) # forward中全连接层激活后调用 X = F.relu(self.fc1(X)) X = self.dropout(X) X = F.relu(self.fc2(X)) X = self.dropout(X)
- 加入早停策略:训练过程中实时监控测试集损失,如果连续3-5个epoch测试集损失没有下降,直接终止训练,避免模型学习训练集噪声。
- 降低模型冗余参数量:你当前第一层全连接层参数量超过500万,对于3分类任务来说冗余度过高,可以把
fc1的输出维度从120下调到32或64,减少过拟合风险。
3 提升分类准确率
- 修正损失计算逻辑:你当前使用的
nn.CrossEntropyLoss()已经内置了softmax和对数计算,模型最后一层不需要再加F.log_softmax(),直接返回self.fc3(X)即可,否则会导致损失计算异常、收敛变慢。 - 改用预训练模型微调:3600张训练样本量较少,自行搭建的小CNN特征提取能力有限,直接使用torchvision提供的ResNet18预训练模型,替换最后一层全连接层为3分类输出,微调10-15个epoch,准确率会有20%以上的明显提升。
- 调整训练超参数:当前epoch设置仅为8,模型还未充分收敛,可上调到15-20,同时加入学习率衰减策略,比如每5个epoch学习率乘以0.5,提升后期收敛效果。
- 校验类别平衡性:统计三类训练样本的数量,如果某类样本量明显低于其他类别,可以给
nn.CrossEntropyLoss()传入weight参数,给少样本类别分配更高的损失权重。
内容的提问来源于stack exchange,提问作者Punpun
相关产品推荐
相关产品推荐

