作者 |KRRAI77@GMAIL.COM
编译 |Flin
起源 |analyticsvidhya
介绍
Fastai 是一个风行的开源库,用于学习和练习机器学习以及深度学习。杰里米·霍华德(Jeremy Howard)和蕾切尔·托马斯(Rachel Thomas)创建了 fast.ai,其指标是使深度学习资源更容易取得。fast.ai 中提供的所有详尽的资源,例如课程,软件和钻研论文都是完全免费的。
2020 年 8 月,fastai_v2 公布,该版本无望更快,更灵便地实现深度学习框架。在 2020 fastai 课程联合了机器学习和深刻学习的外围概念。它还向用户介绍了模型生产和部署的重要方面。
在本文中,我将探讨 fast.ai 初学者课程的前三课中介绍的无关建设疾速简略的图像分类模型的技术。在构建模型的同时,你还将学习如何轻松地为模型开发 Web 应用程序并将其部署到生产环境。
本文将遵循 Jeremy 在其课程中所采纳的自上而下的教学方法。你将首先学习无关训练图像分类器的常识。稍后,将解释无关用于分类的模型的细节。要了解本文,你必须具备 Python 常识,因为 fastai 是用 Python 编写并基于 PyTorch 构建的。倡议你在 Google Colab 或 Gradient 中运行此代码,因为咱们须要 GPU 拜访权限,而且 fastai 能够轻松装置在这两个平台上。
装置,导入和加载数据集
!pip install -Uqq fastbook
import fastbook
fastbook.setup_book()
from fastbook import *
from fastai.vision.widgets import *
装置 fastai 并导入必要的库。如果你应用的是 Colab,则必须提供对 Google 云端硬盘的拜访权限以保留文件和图像。你能够从 Kaggle 和 Bing 图像搜寻等起源下载任何图像数据集。Fast.ai 也有大量的图像汇合。我在本文中应用了来自 https://github.com/ieee8023/c… 的一组胸部 X 射线图像。
path = Path ('/content/gdrive/My Drive/Covid19images')
将数据集地位的门路保留在 Path() 对象中。如果应用 fast.ai 数据集,则能够应用以下代码:
path = untar_data(URLs.PETS)/'images'
这将从 fastai PETS 数据集汇合中下载并提取图像。
查看图像门路并显示数据集中的一些样本图像。我曾经为此应用了 Python Imaging Library(PIL)。
path.ls
from PIL import Image
img = Image.open(path'/train/covid/1-s2.0-S1684118220300682-main.pdf-002-a2.png')
print(img.shape)
img.to_thumb(128,128)
在此图像分类问题中,我将训练模型,以将 X 射线图像分类为 COVID 或 No COVID 类。预处理数据集已搁置在独自的 COVID 和 No COVID 文件夹中(起源:ChristianTutivénGálvez)。
如果你应用的是 fast.ai 数据集,请应用以下函数依据宠物的名称对图像进行分组:
def is_cat(x): return x[0].isupper()
PETS 是猫和狗图像的汇合。Cat 图片标有大写的第一个字母,因而很容易对其进行分类。
图像变换
图像变换是训练图像模型的关键步骤。它也称为数据裁减。为了防止模型过拟合,必须进行图像变换。能够应用多种办法来转换图像,例如调整大小,裁剪,压缩和填充。然而,压缩和填充会争夺图像中的原始信息,并别离增加其余像素。因而,随机调整图像大小会产生良好的成果。
如以下示例所示,在此办法中,在每个期间都对每个图像的随机区域进行采样。这使模型能够理解每个图像的更多细节,从而取得更高的准确性。
要记住的另一个要点是,始终仅变换训练图像,而不批改验证图像。在 fastai 库中,默认状况下会解决此问题。
item_tfms=Resize(128, ResizeMethod.Squish))
item_tfms=Resize(128, ResizeMethod.Pad, pad_mode='zeros')
item_tfms=RandomResizedCrop(128, min_scale=0.3) - 30% of the image area is zoomed by specifying 0.3
Fastai 库通过 aug_transforms 函数提供了一组规范的裁减。如果图像尺寸平均,能够批量利用,节俭大量训练工夫。
tfms = aug_transforms(do_flip = True, flip_vert = False, mult=2.0)
fastai 中的 DataLoaders 类十分便于存储用于训练和验证模型的各种对象。如果要自定义训练期间要应用的对象,则能够将 DataBlock 类与 DataLoaders 联合应用。
data= ImageDataLoaders.from_folder(path,train = "train", valid_pct=0.2, item_tfms=Resize(128), batch_tfms=tfms, bs = 30, num_workers = 4)
如果你在图元文件中定义了图像标签,则能够应用 DataBlock 将图像和标签分为两个不同的块,如上面的代码片段所示。将定义的数据块与数据加载器性能一起应用以拜访图像。
Data = DataBlock(blocks=(ImageBlock, CategoryBlock), get_items=get_image_files,
splitter=RandomSplitter(valid_pct=0.2, seed=42), get_y=parent_label, item_tfms=Resize(128))
dls = Data.dataloaders(path)
模型训练
为了训练该图像数据集,应用了预训练的 CNN 模型。这种办法称为转移学习。杰里米(Jeremy)倡议应用事后训练的模型,以放慢训练速度并进步准确性。这尤其实用于计算机视觉问题。
learn = cnn_learner(data, resnet34, metrics=error_rate)
learn.fine_tune(4)
应用 ResNet34 体系结构,并依据错误率验证后果。因为应用事后训练的模型进行训练,因而应用微调办法而不是对模型进行拟合。
你能够运行更多期间,并查看模型的性能。抉择正确的期间数以防止过拟合。
你能够尝试应用准确性(准确性 = 1- 错误率)来验证模型性能,而不是应用 error_rate。两者都用于验证模型的输入。在此示例中,保留了 20%的数据用于验证。因而,该模型将仅对 80%的数据进行训练。这是查看任何机器学习模型性能的十分要害的一步。你也能够通过更改 ResNet 层(选项为 18、50、101 和 152)来运行此模型。除非你有一个大型数据集将产生精确的后果,否则这可能再次导致过拟合。
验证模型性能
模型性能能够通过不同的形式进行验证。一种风行的办法是应用混同矩阵。矩阵的对角线值批示每品种别的正确预测,而其余单元格值批示许多谬误的预测。
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()
Fastai 提供了一个有用的性能,能够依据最高失落率查看谬误的预测。该函数的输入批示每个图像的预测标签,指标标签,失落率和概率值。高概率示意模型具备较高的置信度。它在 0 到 1 之间变动。高失落率示意模型性能有多差。
interp.plot_top_losses(5, nrows=1, figsize = (25,5))
另一个很棒的 Fastai 性能,ImageClassifierCleaner(GUI),它能够通过删除故障图像或重命名其标签来革除故障图像。这十分有助于数据预处理,从而进步了模型的准确性。
杰里米(Jeremy)倡议在对图像进行根本训练后再运行此性能,因为这能够理解数据集中异样的品种。
from fastai.vision.widgets import *
cleaner = ImageClassifierCleaner(learn)
cleaner
保留和部署模型
训练完模型并对后果称心后,就能够部署模型了。要将模型部署到生产环境中,你须要保留模型体系结构以及对其进行训练的参数。为此,应用了导出办法。导出的模型另存为 PKL 文件,该文件是 pickle(Python 模块)创立的文件。
learn.export()
从导出的文件中创立一个推理学习器,该学习器可用于将模型部署为应用程序。推理学习器一次预测一个新图像的输入。预测返回三个参数:预测类别,预测类别的索引以及每个类别的概率。
learn_inf = load_learner(path/'export.pkl')
learn_inf.predict("img")
(‘noCovid’, tensor(1), tensor([5.4443e-05, 9.9995e-01])) – prediction
有多种办法能够创立用于部署模型的 Web 应用程序。最简略的办法之一是应用作为 GUI 组件的 IPython 小部件在 Jupyter notebook 中为应用程序创立所需的对象。
from fastai.vision.widgets import *
btn_upload = widgets.FileUpload()
out_pl = widgets.Output()
lbl_pred = widgets.Label()
设计应用程序元素后,请应用像 Web 应用程序一样运行 Jupyter notebook 的 Voila 来部署模型。它删除所有单元格输出,仅显示模型输入。要将 notebook 作为 VoilàWeb 应用程序查看,请将浏览器 URL 中的“notebook”一词替换为“voila/render”。必须在蕴含受过训练的模型和 IPython 小部件的同一 notebook 中装置和执行 Voila。
!pip install voila
!jupyter serverextension enable voila --sys-prefix
论断
就这样,你曾经应用 fastai 库构建并部署了一个很酷的图像分类器应用程序,只需八个步骤!这还只是我在本文中展现的冰山一角。有更多的 fastai 组件可用于与 NLP 和计算机视觉相干的各种深度学习用例,你能够摸索这些组件。
以下是 fastai 学习资源,以及我的 git repo,其中蕴含本文中解释的图像分类器的代码和图像。
-
Covid19 X 射线图像分类器:蕴含本文中探讨的残缺代码和数据集
- https://github.com/RajiRai/Fa…
-
涵盖了 fast.ai 课程中传授的所有课程
- https://github.com/fastai/fas…
-
涵盖残缺的 fastai API 文档
- https://docs.fast.ai/
-
Fast.ai 社区论坛
- https://forums.fast.ai/
原文链接:https://www.analyticsvidhya.c…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/