一、介绍

这套代码完成了一个 20 类食物图像分类任务,从目录扫描生成索引,到数据增强、Dataset、DataLoader、CNN 训练、验证、保存最优模型,再到灰度图测试,形成了完整闭环。

二、核心代码讲解

2.1生成索引文件:train_test_file()

它的逻辑是:

1.进入food_dataset/train或food_dataset/test。

2.第一层os.walk遇到的是所有类别文件夹,例如:八宝粥、哈密瓜......

3.把这些类别文件夹排序:sorted(directories),保证train和test的标签顺序一致。

4.再进入每一个类别文件夹,用dirs.index(now_dir[-1])找到当前类别在排序列表中的下标,作为标签。

2.2数据增强与预处理

Resize([256,256]):统一图片大小。

RandomRotation(45):随机旋转最多45度。

CenterCrop(256):中心裁剪。

RandomHorizontalFilp/RandomVerticalFlip:随机水平、垂直翻转。

ColorJitter:随机调整亮度、对比度、饱和度、色调。

RandomGrayscale(p=0.1):10%概率转灰度,增强模型对颜色变化的鲁棒性。

ToTensor():PIL图片转成PyTorch张量,数值从0-255变成0-1.

Normalizze(...):用ImageNet的均值和标准差做标准化。

2.3自定义Dataset

1.读取train.txt或test.txt

2.每行按空格拆成图片路径标签。

3.__getitem__ 打开图片,强制转成 RGB 三通道,再做 transform,返回(image,label)。

因为模型输入必须是三通道,所以即使你给了灰度图,convert('RGB')也会把它变成三通道,只是三个通道数值相同

2.4CNN模型结构

输入是3*256*256,变化过程:

1.conv1:Conv3——>16,kernel=5,padding=2,尺寸保持256;MaxPool后变成16*128*128

2.conv2:Conv16——>32,再Conv32——>32,MaxPool后变成32*64*64。

3.conv3:Conv32——>128,尺寸仍是128*64*64。

4.x.View(x.size(0),-1)展平:128*64*64=524288维。

5.Linear(128*64*64,20)输出20类分数。

2.5训练、验证与测试

损失函数是:criterion = nn.CrossEntropyLoss()

优化器是:optimizer = torch.optim.Adam(model.parameters(),lr=0.001,weight_decay=1e-4)

更多推荐