作者|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 fastbookfastbook.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.lsfrom PIL import Imageimg = 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/