You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:57:04