在计算机视觉领域,端到端的应用涵盖了从数据下载和准备到计算机视觉模型部署的所有必要步骤。本文将详细介绍如何使用一种称为迁移学习的技巧来训练图像分类模型,包括下载数据、执行数据增强、创建数据加载器、训练模型以及导出模型以供进一步使用。将使用fastai库来实现模型流水线。
fastai是一个构建在PyTorch框架之上的深度学习库,提供了一个高级API。若要深入了解该库及其用法,可以参考相关博客。本文假设读者已具备Python3的基础知识和fastai库的初步了解。推荐使用带有GPU的Jupyter Notebook,也可以通过Google Colaboratory访问,它提供了一个基于云的Jupyter笔记本环境,附带免费的Nvidia GPU。
让在Colab中安装fastai库。安装后可能需要重启运行环境。同时,还需要安装nbdev包,该包用于获取fastai函数的文档。
!pip install fastai --upgrade
!pip install nbdev
首先,从fastai库中导入视觉模块,然后使用fastai的untar_data方法下载PETS数据集,该方法返回一个PoxiPath对象。PETS数据集包含狗和猫的图片,训练的模型将用于区分猫和狗。这项任务是2014年Kaggle举办的狗与猫竞赛的一部分。
from fastai.vision.all import *
path = untar_data(URLs.PETS)/'images'
让使用PIL库查看一些图片。
img_paths = path.ls()
def show_image(img_path):
print(img_path)
img = PILImage.create(img_path)
img.show()
显示一些随机图片:
show_image(img_paths[100])
show_image(img_paths[1242])
DataBlock是一个容器,用于快速构建数据集和数据加载器,给定数据路径。让看看如何操作。
def is_cat(x):
if x.name[0].isupper():
return 'Cat'
else:
return 'Dog'
pets = DataBlock(
blocks = (ImageBlock, CategoryBlock),
get_items = get_image_files,
get_y = is_cat,
splitter = RandomSplitter(valid_pct=0.25, seed=42),
item_tfms = Resize(420),
batch_tfms = aug_transforms(size = 244, mult=1.5)
)
dls = pets.dataloaders(path)
显示数据加载器中的一些图片:
dls.show_batch(max_n = 6)
在这里,使用fastai的cnn_learner和预训练的resnet34模型对PETS数据集进行迁移学习和微调。还可以定义度量标准,即准确率和错误率。
learn = cnn_learner(dls, resnet34, metrics=[accuracy, error_rate])
在拟合模型之前,应该找到理想的学习率,以便有效地优化损失函数。因此,可以使用fastai的lr_find方法找到最佳学习率。
learn.lr_find()
输出结果如下:
基本上,从非常低的学习率开始,计算一个小批量的损失,然后将其增加一定百分比或翻倍。直到损失变差为止,跟踪一定范围的学习率。因此,理想的学习率选择是:
可以使用doc()方法了解更多关于任何fastai函数的信息。可以使用以下方法找到lr_find的文档:
doc(learn.lr_find)
现在知道了理想的学习率,可以使用fine_tune方法最终拟合模型。
learn.fine_tune(10, base_lr=3e-3, freeze_epochs=3)
在这里,将freeze_epochs设置为3,即微调模型的轮数。然后对模型进行10轮拟合。有关微调和迁移学习的更多信息,请参考此博客。训练结果如下:
哇!它一直显示99.675%的准确率。对于比赛来说,这是前所未有的结果,深度学习之前是不可能实现的。
现在,让解释模型并绘制混淆矩阵。
interep = ClassificationInterpretation.from_learner(learn)
interep.plot_confusion_matrix()
混淆矩阵:
可以看到,模型非常准确,验证集中只有6张图片中的1847张被误分类。
现在可以将训练好的模型以pickle文件的形式导出,稍后加载或在部署期间使用。
learn.export(fname='pets_classifier.pkl')
可以从pickle文件中再次加载模型并进行预测。
load_inf = load_learner('pets_classifier.pkl')
img1 = img_paths[1034]
show_image(img1)
load_inf.predict(img)
img1 = img_paths[2312]
show_image(img1)
load_inf.predict(img)
因此,可以使用此模型在部署环境中进行预测。
可以使用上述模板对任何数据集执行图像分类。有关更多信息,请参考fastai文档。
谢谢,祝深度学习愉快!!
1. 《Practical Deep Learning for Coders》by Jeremy Howard and Sylvain Gugger