高效图像分类秘诀:在PyTorch中使用ResNet50进行迁移学习

2024年07月08日 由 alex 发表 439 0

迁移学习是利用预训练模型增强图像分类的一种有效方法。本文介绍的 Jupyter Notebook 提供了在 PyTorch 中使用 ResNet50 模型的实践指南。它具有灵活的设计元素,可根据所提供图像数据的目录设置随时适应任何类别分类。用户只需更新数据目录,就能毫不费力地根据新数据集调整笔记本。


该笔记本既可以在本地机器上使用,也可以在 Kaggle 和 Colab 等在线平台上使用,在这些平台上可以借助免费的 GPU 加速器运行。笔记本中包含将其导入这些平台的详细说明。其主要目的是为有意将 ResNet50 等预训练模型应用于特定图像数据集的个人提供一个全面的框架。本笔记本介绍了数据准备和模型架构配置,并使用 PyTorch 介绍了三种不同的训练策略。此外,它还利用混淆矩阵等工具探讨了模型评估技术,并举例说明了错误分类的情况,以便于加深理解和分析。


所使用的示例是来自 Kaggle 的蔬菜图像数据集,但其方法和代码具有通用性,适用于任何基于图像的数据集。


主要内容包括:


1


设置和初始化

笔记本可在 GitHub 上获取,并可无缝导入 Kaggle 或 Colab,供喜欢使用这些平台的用户使用。这两个平台都提供一定的免费使用时长,包括 GPU 加速,这对于训练和试验较小的数据集来说是足够的。本笔记本中的数据集主要用于蔬菜分类,可随时从 Kaggle 获取。它可以直接从 Kaggle 网站下载,也可以通过本地机器上的 Kaggle API 命令下载。笔记本中包含访问和使用数据集的全面说明。


数据准备

该笔记本展示了灵活的数据加载策略,可将数据集分为训练和验证用的独立目录,或自动分割的单一根目录。这种设置可确保笔记本能够轻松适应不同的图像数据集。


在机器学习的数据处理中,通常有两种典型的数据集组织方式:

  1. 预分离数据: 数据集在整理时已将训练和验证图像分类到各自的特定类别目录中。这种设置便于使用 PyTorch 的 ImageFolder 等工具简单直接地加载数据,这些工具会根据目录结构自动标记图像。
  2. 单目录数据: 所有图像类文件夹都存储在一个根目录中,需要使用 scikit-learn 的 train_test_split 等工具手动分割成训练集和验证集。这种方法能确保类的均衡分布,但需要额外的编码才能有效管理数据分割和加载过程。


下面是 pytorch 中典型的 DataLoader 管道,后端是 ImageFolder。


2


模型准备

ResNet50 被用作基础模型,以充分利用其广泛的预训练。该策略包括保留所有原始层的权重,但最后一个卷积块中的权重和新增的密集层除外,这些层专门用于在新数据集上进行训练。适配过程从加载预训练的 ResNet50 模型开始,然后移除其最后两层,以调整网络的输出能力。为了保持所学特征的完整性,除了最后一个卷积块外,所有层都被冻结,确保在训练过程中只更新网络的最后部分。其他修改包括整合自适应平均池化层和剔除层,加强正则化以防止过拟合。此外,还引入了一个新的全连接层,用于输出指定类别数量的预测结果。该模型的前向方法描述了输入通过修改后的网络的过程,最后应用剔除和密集层生成最终的类别预测。这种方法有效地将 ResNet50 强大的特征提取能力与量身定制的调整相结合,针对迁移学习场景中的特定分类任务进行了优化。


3


训练方法

为了充分发挥 ResNet50 模型在图像分类任务中的潜力,本笔记本展示了三种不同的训练方法。每种方法都能满足不同的偏好和要求,确保对模型能力的全面理解和应用。


  1. 标准训练循环: 第一种方法是使用标准训练循环的传统方法。这种方法可以对训练过程的各个方面进行细化控制,从明确定义前向和后向传递到手动处理优化步骤。这种方法非常适合那些希望深入了解训练过程基本机制或需要定制循环特定部分的人。
  2. Ignite包: 第二种方法利用 PyTorch Ignite 库,该库抽象掉了许多通常与 PyTorch 训练循环相关的模板代码。Ignite 提供了一种创建训练循环的高级方法,使代码更加简洁明了。这种方法对于追求代码简洁高效的开发人员尤其有利,他们可以将更多精力放在模型架构上,而不是训练机制上。
  3. Lightning 软件包: 第三种方法采用了 PyTorch Lightning,它通过自动化 PyTorch 培训中涉及的许多常规任务,进一步简化了培训过程。Lightning 为组织 PyTorch 代码提供了一个结构化而又灵活的框架,减少了所需的代码量,同时提高了代码的可读性。这种方法非常适合寻求简化实验和提高可扩展性的研究人员和开发人员,能以更少的代码完成更复杂的操作。


在这些方法中,PyTorch Lightning 因其易用性和高度抽象性而越来越受欢迎,大大加快了研究和开发周期。它让开发人员能够将更多精力放在实验设计上,而不是编码模型训练和验证的复杂细节。其不断扩大的社区和丰富的文档进一步促进了其在学术界和工业界的应用。


模型评估

在模型评估阶段,笔记本通过显示混淆矩阵来说明模型的性能。该矩阵有助于直观地了解模型在不同类别中的准确性,找出优势和需要改进的地方。此外,为了进行更详细的分析,笔记本还显示了被错误分类的图像(即假阳性图像)及其预测标签和真实标签。这一功能对于诊断模型的行为以及通过分析其未能正确预测的特定实例来改进其准确性尤为有用。


4


5


将迁移学习作为一种战略方法的立论依据

文章的上一部分详细介绍了笔记本的组织和结构。本节旨在通过使用 kaggle 数据集分析 Jupyter 笔记本中的训练数据,为迁移学习提供令人信服的理由。它比较了以随机权重初始化的 ResNet50 模型和通过迁移学习增强的模型的训练日志。其目的是根据观察到的数据,说明为什么迁移学习在大多数情况下都比从头开始训练模型效果更好。此外,附图对有无迁移学习的训练进行了比较,直观地证明了这种方法在模型训练中的有效性。让我们深入研究这些图表,进一步证实使用迁移学习的合理性。


无迁移学习


6


7


  • 损失历史: 训练损失和验证损失开始时都很高,训练损失最初急剧下降,然后趋于平稳。验证损失遵循类似的轨迹,但始终高于训练损失,这表明模型在学习训练数据的具体细节时出现了一些过度拟合,而不是将其泛化到未见过的数据上。
  • 准确率历史: 训练和验证的准确率在最初的历时中都提高得很快。然而,虽然训练准确率持续上升并稳定在 1.0 附近,但验证准确率却比训练准确率更早地趋于平稳,而且水平更低,这进一步表明存在过度拟合。
  • 训练持续时间: 在 Nvidia RTX 3060 上使用 15K 幅图像时,epoch 持续时间平均约为 1 分 26 秒,这主要是由于需要更新的权重数量庞大。试想一下,训练数百万张图像的数据需要多少时间?


迁移学习


8


9


  • 损失历史: 与非迁移学习方案相比,训练损失和验证损失的起始水平都要低得多,在最初的历时中迅速下降,并很快趋于稳定。训练损失线和验证损失线很接近,这表明模型的泛化效果很好,没有明显的过度拟合。
  • 准确率历史: 准确率从较高水平开始,很快达到接近满分的水平。在整个训练过程中,训练精确度和验证精确度都非常接近,这表明模型具有出色的泛化能力。
  • 训练持续时间: 每个epoch的持续时间降至约45秒。时间大幅缩短的主要原因是需要更新的权重减少了,这表明训练效率提高了,尤其是在扩展到可能包含数百万张图像的更大数据集时。


事实证明,迁移学习对大型数据集尤为有效。通过利用已有知识并将更新重点放在后层,它能确保更快地减少损失并提高准确性。这种方法不仅省时,而且计算经济,因此非常适合庞大的数据集,在这些数据集中,由于需要大量的时间和资源,从头开始训练是不切实际的。


迁移学习的优势:

  • 显著减少训练时间和计算需求
  • 经证实可有效提高性能
  • 可及性和易用性
  • 资源优化
  • 支持数据和观察结果


经验证据支持迁移学习的有效性。在从头开始训练完整模型的情况下,不仅训练时间大幅增加,计算负荷也急剧上升,往往需要更强大的硬件,导致运营成本增加。这些数据强调了采用迁移学习方法在节省时间和成本方面的实际优势。

文章来源:https://medium.com/@arshad.mehmood/efficient-image-classification-recipes-transfer-learning-with-resnet50-in-pytorch-4df556941e0d
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消