当我第一次开始使用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()
输出看起来像这样,如果我们采用特定的学习率值,则可以清楚地看到我们的损失。
看起来学习率大约为1e-3足以确保我们的损失随着训练而减少。我们从这里开始
learn=cnn_learner(dls, resnet34, metrics=accuracy) learn.fit_one_cycle(10, 1e-3)
在前几个批次中,我们看到了相当可观的结果。
注意:我在GPU上训练了模型,这就是为什么每个时期只需要几秒钟的原因。如果您仅在CPU上进行训练,则每个过程将花费更长的时间,有时甚至需要10分钟左右。
现在我们已经在较小的图像尺寸上训练了模型,我们可以继续进行训练的第二部分。
在下一个模型微调中,我们使用批处理大小为128,图像大小为224。
learn.dls=get_dls(128, 224) learn.fine_tune(5, 1e-3)
如您所知,在我们的训练中,我们的准确性达到了将近95%,在GPU上只需花费三分钟的时间进行训练!
总结
Fastai使我们能够快速开发任何深度学习任务,并且正如我在前几周进行的尝试一样,我发现自己越来越喜欢这种超级简单的方法。如果您热衷于跟着我走这条路,请确保跟随我继续更新,因为我将使用这个令人惊叹的库探索更多的深度学习任务。