《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

一、迁移学习的简单介绍

1.迁移学习是什么?

  • 迁移学习是指利用已经训练好的模型,在新的任务上进行微调。
  • 迁移学习可以加快模型训练速度,提高模型性能,并且在数据稀缺的情况下也能很好地工作。

2.迁移学习的步骤

  • (1) 选择预训练的模型和适当的层:通常,我们会选择在大规模图像数据集(如ImageNet)上预训练的模型,如VGG、ResNet等。然后,根据新数据集的特点,选择需要微调的模型层。对于低级特征的任务(如边缘检测),最好使用浅层模型的层,而对于高级特征的任务(如分类),则应选择更深层次的模型。
  • (2) 冻结预训练模型的参数:保持预训练模型的权重不变,只训练新增加的层或者微调一些层,避免因为在数据集中过拟合导致预训练模型过度拟合。
  • (3) 在新数据集上训练新增加的层:在冻结预训练模型的参数情况下,训练新增加的层。这样,可以使新模型适应新的任务,从而获得更高的性能。
  • (4) 微调预训练模型的层:在新层上进行训练后,可以解冻一些已经训练过的层,并且将它们作为微调的目标。这样做可以提高模型在新数据集上的性能。
  • (5) 评估和测试:在训练完成之后,使用测试集对模型进行评估。如果模型的性能仍然不够好,可以尝试调整超参数或者更改微调层。

二、数据集介绍

  • 下图是数据集的结构
    • 在 food_dataset2 文件夹下含有训练数据和测试数据
    • 训练集和测试集数据中都含有 20 种食物图片,数量在200~400不等
    • trainda.txt 和 testda.txt 文本中存放了每张图片的路径及标签,用 0~19 这20个数字分别对20种食物进行标签
    • 在代码中通过trainda.txt 和 testda.txt 文本中的内容来获取每张图片及对应的标签
      在这里插入图片描述
    • 下面是trainda.txt文本中的部分内容(testda.txt 中的内容格式相同)
      在这里插入图片描述
  • 送福利!!! 私信送此数据集 !!!

三、代码实现

1. 步骤

  • 1.调用resnet18模型,并保存需要训练的模型参数
  • 2.定义一个图像预处理和数据增强字典
  • 3.定义获取每张食物图片和标签的类方法
  • 4.获取训练集和测试集数据
  • 5.对数据集进行打包
  • 6.调用交叉熵损失函数并创建优化器
  • 7.定义训练模型的函数
  • 8.定义测试模型的函数
  • 9.训练模型,并每训练一轮测试一次

2.所用到方法介绍的文章链接

3. 完整代码

import torch
	import torchvision.models as models  # 导入存有各种深度学习模型的模块
	from torch import nn  # 导入神经网络模块
	from torch.utils.data import Dataset, DataLoader  # Dataset: 抽象类,一种用于获取数据的方法  DataLoader:数据包管理工具,打包数据
	from torchvision import transforms  # transforms模块提供了一系列用于图像预处理和数据增强的函数和类
	from PIL import Image  # 用于处理图片
	import numpy as np
	
	""" 调用resnet18模型 """
	resnet_model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
	
	for param in resnet_model.parameters():
	    param.requires_grad = False
	# 模型所有参数(即权重和偏差)的 requires_grad 属性设置成 False,从而冻结所有模型参数
	# 使得在反向传播过程中不会计算他们的梯度,从此减少模型的计算量,提高推理速度
	
	in_features = resnet_model.fc.in_features  # 获取resnet18模型全连接层原输入的特征个数
	resnet_model.fc = nn.Linear(in_features, 20)  # 创建一个全连接层输入特征个数为: in_features  输出特征个数为:数据集中事务的种类数量
	
	params_to_update = []  # 保存需要训练的参数,仅仅包含全连接层的参数
	for param in resnet_model.parameters():
	    if param.requires_grad == 
### ResNet18模型迁移学习中的应用与微调 迁移学习是一种有效的技术,尤其适用于数据量较小的任务场景。通过使用预训练的深度神经网络模型(如ResNet18),可以在新任务上快速构建高性能模型[^2]。 #### 微调ResNet18的关键步骤 以下是关于如何在迁移学习中有效应用和微调ResNet18模型的核心方法: 1. **加载预训练模型** 使用PyTorch或其他框架可以直接加载已有的ResNet18权重文件。这些权重通常是在大规模图像分类任务(如ImageNet)上预先训练得到的。这一步骤能够显著减少计算资源需求并提升初始性能。 ```python import torch from torchvision import models resnet18 = models.resnet18(pretrained=True) ``` 2. **冻结部分层参数** 在某些情况下,为了防止破坏预训练模型提取到的基础特征,可以选择性地冻结模型的一部分卷积层参数。这样可以专注于调整全连接层或最后几层卷积层来适配目标任务的数据分布。 ```python for param in resnet18.parameters(): param.requires_grad = False ``` 3. **修改最后一层以匹配目标类别数** 原始ResNet18的最后一层是一个线性分类器,默认用于识别ImageNet上的1000类对象。如果当前任务涉及不同的类别数量,则需替换该层以适应具体的需求。 ```python num_ftrs = resnet18.fc.in_features resnet18.fc = torch.nn.Linear(num_ftrs, target_classes_count) # 替换为自定义输出大小 ``` 4. **设置优化器与损失函数** 定义适合于特定应用场景的学习率策略以及相应的梯度下降算法(SGD/Adam)。同时指定交叉熵作为主要评估指标之一。 ```python criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(resnet18.fc.parameters(), lr=0.001, momentum=0.9) ``` 5. **执行训练过程** 利用准备好的数据集迭代更新可训练参数直至收敛或者达到预定的最大轮次限制为止。期间可根据验证集合表现动态调节超参设定进一步改善效果。 6. **解冻更多层进行更深层次的微调** (可选操作) 如果发现仅改变顶层不足以满足精度要求的话,还可以逐步放开前面若干隐藏单元重新参与反向传播运算从而获取更加精细的结果表示形式。 以上即构成了基于经典架构——ResNet18实施迁移学习的整体流程概述[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值