简介
上一篇博客我们使用自己的数据集进行训练,生成了自己数据集的train.txt和test.txt文本,也说明了什么是数据增强。今天我们就来看看如何保存和使用最优模型。
深度学习系列之第五课卷积神经网络_CNN_如何训练自己的数据集(暨食物分类案例)
一、保存最优模型
对于训练结果,我们使用的都是的都是最后一轮的结果,但是最后一轮并不是训练出最好的模型,使用我们要把这个最好的模型保存下来。
1. 导入必要的库
importtorchfrom torch.utils.dataimportDataLoader,Datasetfrom PILimportImagefrom torchvisionimporttransforms# 对数据进行处理importnumpyas np from torchimportnntorch: PyTorch 深度学习框架的核心库DataLoader, Dataset: 用于数据加载和处理的工具类Image: 用于图像读取的 PIL 库transforms: 用于图像预处理的工具numpy: 用于数值计算的库nn: PyTorch 的神经网络模块
2. 图像预处理定义
data_transforms={# 字典,存储不同阶段的图像处理方式'train':transforms.Compose([# 组合多个变换transforms.Resize([300,300]),# 图像变换大小transforms.RandomRotation(45),# 图片随机旋转(-45到45度)transforms.CenterCrop(256),# 从中心开始裁剪到256x256transforms.RandomHorizontalFlip(p=0.5),#50%概率水平翻转transforms.RandomVerticalFlip(p=0.5),#50%概率垂直翻转transforms.ToTensor(),# 转换为Tensor格式transforms.Normalize([0.485,0.456,0.486],[0.229,0.224,0.225])# 归一化]),'valid':transforms.Compose([transforms.Resize([256,256]),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.486],[0.229,0.224,0.225])]),}定义了训练集和验证集的图像预处理流程,训练集使用了更多的数据增强技术来提高模型的泛化能力。
3. 自定义数据集类
classfood_dataset(Dataset):# 继承Dataset类 def__init__(self,file_path,transform=None):self.file_path=file_path self.imgs=[]self.labels=[]self.transform=transform # 读取文件列表和标签withopen(file_path,'r')as f:samples=[x.strip().split(' ')forx in f.readlines()]forimg_path,label in samples:self.imgs.append(img_path)self.labels.append(label)def__len__(self):# 返回数据集大小returnlen(self.imgs)def__getitem__(self,idx):# 读取图像 image=Image.open(self.imgs[idx])ifself.transform:# 应用预处理 image=self.transform(image)# 处理标签 label=self.labels[idx]label=torch.from_numpy(np.array(label,dtype=np.int64))returnimage,label自定义数据集类,用于加载食品图像数据和对应的标签,实现了 PyTorch 要求的三个核心方法:
__init__: 初始化数据集,读取图像路径和标签__len__: 返回数据集样本数量__getitem__: 根据索引返回单个样本(图像和标签)
4. 数据加载器
# 创建数据集实例 train_data=food_dataset(file_path='train.txt',transform=data_transforms['train'])test_data=food_dataset(file_path='test.txt',tr