使用Fastai中的学习率查找器和渐进式调整大小提高训练效率

简介: 使用Fastai中的学习率查找器和渐进式调整大小提高训练效率

当我第一次开始使用fastai时,我非常兴奋地建立并训练了一个深度学习模型,它可以在很短的时间内产生惊人的结果。

我将在本文的最后链接我以前的文章,在这些文章中我用fastai记录了我的学习过程。:)

获得数据

我们需要这些数据来开始。它来自于Kaggle的石头剪刀布数据集。这个任务变成了一个多类图像分类问题,有三个类(每个类都有训练,验证,测试文件夹)包含大小为300x300的RGB颜色图像。

导入fasti vision的所有函数并设置path变量。

fromfastai.vision.allimport*path=Path('/storage/RockPaperScissors/RockPaperScissors/data/')
path.ls()
Output:
(#4) [Path('/storage/RockPaperScissors/RockPaperScissors/data/test2'),Path('/storage/RockPaperScissors/RockPaperScissors/data/valid'),Path('/storage/RockPaperScissors/RockPaperScissors/data/.DS_Store'),Path('/storage/RockPaperScissors/RockPaperScissors/data/train')]
#makesuretosetthatpathtowhereveryou've kept your data either locally or online.

现在我们将定义一个数据块来从文件夹中获取数据。我们指定这些是为了确保在编写最少的代码并使我们的数据对模型可用:

如何使用get_image_files函数获取图像文件:获取训练和验证文件夹中的所有图像文件

使用parent_label获取类,以确保我们将直接父文件夹名称作为我们的类名称

最后,使用GrandparentSplitter分割训练和验证,这将为我们提供单独的数据集,用于训练和验证。

defget_dls(bs, size):
dblock=DataBlock(blocks= (ImageBlock, CategoryBlock),
get_items=get_image_files,
get_y=parent_label,
splitter=GrandparentSplitter(),
item_tfms=Resize(size)
                    )
returndblock.dataloaders(path, bs=bs)

这将返回一个数据加载器,它将使我们的批处理大小为bs,图像大小为size。

什么是渐进式调整大小,我们如何应用它?

就像Jeremy在他的书中所说的那样:使用小图像开始训练,然后使用大图像结束训练。将大多数时期的训练花费在较小的图像上,有助于更快地完成训练。使用大图像完成训练会使最终精度更高。

这是一种实验技术,与获得相同大小的图像时相比,这种技术已被证明在获得更高的精度方面非常有用。

现在让我们看看如何训练多种尺寸,对吗?

我们将批处理大小设为64,图像大小设为较小的128x128。

dls=get_dls(64, 128)

现在,让我们继续计算在此部分训练中应使用的学习率。

寻找合适的学习率

首先,我们通过下面的代码利用迁移学习来建立模型。

learn=cnn_learner(dls, resnet34, metrics=accuracy)

然后,我们绘制一个图表以查看有关找到学习率的信息。

learn.lr_find()

输出看起来像这样,如果我们采用特定的学习率值,则可以清楚地看到我们的损失。

640.png

看起来学习率大约为1e-3足以确保我们的损失随着训练而减少。我们从这里开始

learn=cnn_learner(dls, resnet34, metrics=accuracy)
learn.fit_one_cycle(10, 1e-3)

在前几个批次中,我们看到了相当可观的结果。

640.png

注意:我在GPU上训练了模型,这就是为什么每个时期只需要几秒钟的原因。如果您仅在CPU上进行训练,则每个过程将花费更长的时间,有时甚至需要10分钟左右。

现在我们已经在较小的图像尺寸上训练了模型,我们可以继续进行训练的第二部分。

在下一个模型微调中,我们使用批处理大小为128,图像大小为224。

learn.dls=get_dls(128, 224)
learn.fine_tune(5, 1e-3)

640.png

如您所知,在我们的训练中,我们的准确性达到了将近95%,在GPU上只需花费三分钟的时间进行训练!

总结

Fastai使我们能够快速开发任何深度学习任务,并且正如我在前几周进行的尝试一样,我发现自己越来越喜欢这种超级简单的方法。如果您热衷于跟着我走这条路,请确保跟随我继续更新,因为我将使用这个令人惊叹的库探索更多的深度学习任务。

目录
相关文章
|
6天前
|
机器学习/深度学习 人工智能 算法
【PyTorch深度强化学习】TD3算法(双延迟-确定策略梯度算法)的讲解及实战(超详细 附源码)
【PyTorch深度强化学习】TD3算法(双延迟-确定策略梯度算法)的讲解及实战(超详细 附源码)
537 1
|
9月前
|
机器学习/深度学习 缓存 监控
Pytorch学习笔记(7):优化器、学习率及调整策略、动量
Pytorch学习笔记(7):优化器、学习率及调整策略、动量
432 0
Pytorch学习笔记(7):优化器、学习率及调整策略、动量
|
调度 算法框架/工具
Keras 学习率调整
Keras 学习率调整
452 0
|
3天前
|
机器学习/深度学习 自然语言处理 算法
深度探索自适应学习率调整策略在深度学习优化中的应用
【5月更文挑战第17天】 在深度学习的复杂网络结构中,学习率扮演着至关重要的角色。一个合适的学习率可以加快收敛速度,避免陷入局部最小值,并提高模型性能。然而,固定的学习率往往难以适应不同阶段的训练需求。因此,自适应学习率调整策略应运而生,其通过动态调整学习率以响应训练过程中的变化,从而提升优化效率。本文将深入分析几种先进的自适应学习率方法,探讨它们的工作原理、优缺点及在实际问题中的应用效果。
|
6天前
|
机器学习/深度学习 存储 自然语言处理
深度探索自适应学习率调整:从传统方法到深度学习优化器
【5月更文挑战第15天】 在深度学习的复杂网络结构与海量数据中,学习率作为模型训练的关键超参数,其调整策略直接影响着模型的收敛速度与最终性能。传统的学习率调整方法,如固定学习率、学习率衰减等,虽然简单易行,但在多样化的任务面前往往显得力不从心。近年来,随着自适应学习率技术的兴起,一系列创新的优化器如Adam、RMSProp和Adagrad等应运而生,它们通过引入自适应机制动态调整学习率,显著改善了模型的训练效率与泛化能力。本文将深入剖析传统学习率调整方法的原理与局限性,并详细介绍当前主流的自适应学习率优化器,最后探讨未来可能的发展方向。
|
6天前
|
机器学习/深度学习 算法 搜索推荐
揭秘深度学习中的自适应学习率调整策略
【4月更文挑战第30天】 在深度学习领域,优化算法的学习率是影响模型性能的关键因素之一。一个合适的学习率能够加快收敛速度,提高模型的泛化能力。然而,固定的学习率往往难以适应不同阶段的训练需求。因此,研究者们提出了多种自适应学习率调整策略以应对这一挑战。本文将深入探讨几种常用的自适应学习率方法,包括AdaGrad、RMSProp、Adam及其变种,分析它们的工作原理与实际应用效果,并讨论它们在特定问题中的选择指南。
|
6月前
|
机器学习/深度学习 算法 PyTorch
机器学习-学习率:从理论到实战,探索学习率的调整策略
机器学习-学习率:从理论到实战,探索学习率的调整策略
127 0
|
10月前
|
机器学习/深度学习
采用附加动量法和自适应学习率设计来改进bp神经网络的迭代速度,如果不迭代学习率会提高精度;迭代学习率(自适应)会加快收敛,但精度降低(Matlab代码实现)
采用附加动量法和自适应学习率设计来改进bp神经网络的迭代速度,如果不迭代学习率会提高精度;迭代学习率(自适应)会加快收敛,但精度降低(Matlab代码实现)
|
12月前
|
人工智能 算法 调度
马腾宇团队新出大模型预训练优化器,比Adam快2倍,成本减半
马腾宇团队新出大模型预训练优化器,比Adam快2倍,成本减半
|
机器学习/深度学习 数据可视化 PyTorch
【Ignite实践】更少的代码量训练模型(一)
【Ignite实践】更少的代码量训练模型(一)
167 0