72FAST.AI 深度学习实践课程--FAST.AI 基本核心概念

FAST.AI 基本核心概念

FAST.AI 介绍

FAST.AI 是一家位于美国的深度学习研究机构,致力于让更多人更方便地使用深度学习技术。FAST.AI 的创始人是杰里米·霍华德(Jeremy Howard)。他是旧金山大学的教职员工,同时也是一位企业家,商业分析师和教育家。
目前,FAST.AI 主要在做两件事情:制作传播深度学习知识的 MOOC,和维护 FAST.AI 深度学习工具库。当然,FAST.AI 也会做一些前沿研究,包括对深度学习社区做贡献。
FAST.AI 深度学习工具库基于著名深度学习框架 PyTorch 构建,PyTorch 是由 Facebook 主导开发的深度学习框架,因其高效的计算过程以及良好的易用性被诸多大公司和科研人员所喜爱。你可以把 FAST.AI 看作是 PyTorch 的更高阶 API,使深度学习初学者可以通过简单的几行代码就能构建和训练深度学习模型。
本次课程中,我们将对 FAST.AI 进行介绍,并尝试利用 FAST.AI 来完成图像处理,文本处理,协同过滤等应用。虽然 FAST.AI 能够大幅降低深度学习的使用门槛,但本次课程还是希望大家具备一定的深度学习基础知识,这样才能够更好地理解课程中涉及到的相关概念。
FAST.AI 深度学习工具库一经推出就大受欢迎,目前其 Github 开源仓库 已累计了数十万 Star。FAST.AI 目前只支持在 Python 3.6 和 PyTorch 1.x 及更高版本下使用。本地使用时可以通过 coda 和 pip 方式安装。

FAST.AI 模块

学习一个库的使用,首先是了解其包含的主要模块。FAST.AI 虽然是基于 PyTorch 封装,但实际上可以看作是一个比较独立的深度学习库。FAST.AI 包含 20 余个大大小小的模块,我们挑出其核心模块进行介绍。
fastai.vision:主要用于针对图像处理和建模。
fastai.text:主要用于针对文本处理和建模。
fastai.tabular:主要用于数据结构化操作。
fastai.collab:主要用于解决协同过滤问题。
fastai.basic_data:该模块定义基本 DataBunch 数据类,用于建模。
fastai.layers:该模块包含模型中所需的基本自定义层和一些辅助函数。
fastai.datasets:该模块方便下载一些常用的基准数据集。

以下是 FAST.AI 模块之间的依赖关系,部分模块我们没有介绍,不过你可以通过字面意思简单理解。


image.png

其中,Core 是 FAST.AI 的底层实现模块,core 和 torch_core 分别依赖于 NumPy,Pandas,Matplotlib 和 PyTorch 库实现。Training 部分是训练方法,这个会在后面详细介绍。最后呈现的是 FAST.AI 主要的 4 个应用模块:计算机视觉、自然语言处理、协同过滤,以及针对表格数据的处理方法。

FAST.AI 数据集

上面提到的部分核心模块中,fastai.vision,fastai.text,fastai.tabular,fastai.collab 都会在后续内容中详细讲解。所以,本次实验,我们重点关注一下 FAST.AI 支持的数据集和数据类型。
数据是一切机器学习应用的前提,不同工具支持的数据类型也不太一样。例如,scikit-learn 支持 Python 数组和 NumPy 数组,而 TensorFlow 和 PyTorch 都有自己特别定义的张量类型。FAST.AI 基于 PyTorch 开发,所以其沿用了 PyTorch 的数据类型。

FAST.AI 提供了一套方便的基准数据集接口 fastai.datasets,我们可以快速下载 MNIST,COCO 等常用的基准数据集。fastai.datasets 模块中重点有如下几个类和方法:
URLs:获取相应数据集的下载链接。
untar_data:下载数据集并解压。
download_data:仅下载数据集,不解压。

这三个方法实际上是配合使用的,实际上我们更常用到 untar_data(URLs.MNIST_TINY) 这样的组合,意思是下载 MNIST_TINY(MNIST 精简数据集)并解压。FAST.AI 支持的数据集可以通过 数据集说明网页 查看。接下来,我们尝试下载 MNIST 完整数据集并解压。由于 FAST.AI 数据集均托管于 AWS 静态储存,国内下载容易超时,所以我们通过 download_data 从蓝桥云课服务器上下载本次实验所需数据。

from fastai.datasets import untar_data, URLs, download_data

# 因原数据集下载较慢,从蓝桥云课服务器下载数据,本次实验时无需此行代码
download_data("https://labfile.oss.aliyuncs.com/courses/1445/mnist_png")
mnist_path = untar_data(URLs.MNIST)
mnist_path

可以看到,最终返回了数据集的默认储存路径。然后,我们可以通过 ls() 方法查看目录结构。

mnist_path.ls()  # 进一步查看目录结构

(mnist_path/'training').ls()  # 进一步查看目录结构

可以看到,训练和测试数据分别放置在 trainingtesting 文件夹中,而不同类别的样本使用单独子文件夹存放。当然,FAST.AI 提供的数据集并不是每一个都是如上所示的存放结构,基本上每一个都不一样。
由于 MNIST 本身是图像数据,所以我们可以使用 fastai.vision.ImageList 来加载该数据集,该类具备的 ImageList.from_folder 方法能够遍历整个目录下的样本数据。FAST.AI 大部分方法在理解时,都可以根据字面意思揣摩其用途。

from fastai.vision import ImageList

# 遍历指定路径下的图像样本
mnist_data = ImageList.from_folder(mnist_path)
mnist_data

你会看到输出的图像尺寸和样本总数,尝试读取第一个样本。

mnist_data[0]  # 读取第一个样本

样本会直接以图片的形式展示出来,这就是 FAST.AI 这类高阶 API 的方便之处。

DataBunch 对象

如果你有使用 PyTorch 的经验,应该知道 PyTorch 中传入模型的数据会被制作成为 Dataloader 数据加载器。数据加载器包含了一系列对数据的预处理流程,以及能够以小批量的方式加载数据,这在深度学习中是非常重要的。FAST.AI 中一个类似的概念是 DataBunch,DataBunch 是传入模型的基本对象,你可以通过部分 FAST.AI Dataset 或 PyTorch DataLoader 进行构建。首先,我们来看一下使用 FAST.AI Dataset 来快速构建一个 DataBunch 对象。
ImageDataBunch
我们可以使用 fastai.vision.ImageDataBunch 来快速构建一个图像类的 DataBunch 对象。同样,我们会用到一个 ImageDataBunch.from_folder 从文件夹路径构建的方法,这和上面非常相似。
DataBunch 对象基本参数为 DataBunch(train_dl:DataLoader,valid_dl:DataLoader),所以需要传入训练集和验证集。如果你的路径下文件夹名称以 trainvalid 这样的规范名称命名,ImageDataBunch.from_folder 可以自动识别。否则,就需要像下方一样自定义。

from fastai.vision import ImageDataBunch

# 传入数据集路径,以及指定路径下训练集和验证集文件夹名称
mnist_data_bunch = ImageDataBunch.from_folder(
    mnist_path, train='training', valid='testing')
mnist_data_bunch

DataBunch 自动列出了训练集和验证集的样本数量。你可能会感觉这不是和上面的 ImageList 相差无几吗?实际上大有差别。DataBunch 基于 ImageList 构建,并支持一系列更高阶的方法。
例如,我们就可以调用 DataBunch 支持的 .show_batch 可视化一个小批次样本。

# 传入预览行数,图像尺寸
mnist_data_bunch.show_batch(3, figsize=(5, 5))

或者通过 one_batch 直接读取一个小批次的张量数据。由于上方构建 DataBunch 时未指定 batch 大小,默认是 64。

# 读取 DataBunch 中的一个小批次数据
mnist_data_bunch.one_batch()

DataBunch 支持的更多方法可以通过 官方文档 查看。
TextDataBunch
除了图像数据,文本数据也是常见的一类。接下来,我们以 FAST.AI 提供的文本数据集为例,将其处理成 DataBunch 对象。IMDB 是一个电影评论数据集,其记录了 IMDB 网站中的电影评论,并为这些文本数据添加了积极和消极标签。
同样,首先下载该数据集:

imdb_path = untar_data(URLs.IMDB_SAMPLE)
imdb_path, imdb_path.ls()  # 查看路径

对于文本数据,我们可以使用 fastai.text.TextDataBunch 来快速构建一个图像类的 DataBunch 对象。其提供了 from_folderfrom_csvfrom_dffrom_tokens 等多个方法。
根据上面的路径,我们可以看出数据全部存放与 texts.csv 中,所以我们使用 TextDataBunch.from_csv 来读取数据。其中,需要传入路径和文件名参数。默认情况下,该方法因为默认参数 valid_pct=0.2 会将全部数据中的 20% 划为验证集。

from fastai.text import TextDataBunch

imdb_data_bunch = TextDataBunch.from_csv(imdb_path, 'texts.csv')
imdb_data_bunch

使用 .show_batch() 方法可以查看以 DataFrame 样式呈现的 DataBunch 对象数据

imdb_data_bunch.show_batch()

同样,.one_batch() 则可以输出字典编码后的一个小批次数据。

imdb_data_bunch.one_batch()

你会发现,FAST.AI 在设计 API 时沿用了相似的命名规则。这样,当你熟悉一类方法后,即可迁移到其他方面。这一点,随着学习的深入会更加清晰。

CIFAR10 图像数据处理

CIFAR10 是计算机视觉领域经常会使用到的一个基准数据集,其包括 10 个类别,共计 60000 个 32x32 彩色图像。

image.png

接下来,请从 FAST.AI 提供的 数据集 中,导入 CIFAR10。需要注意的是,CIFAR10 在 FAST.AI 中的下载链接为 URLs.CIFAR。由于下载速度较慢,你可以使用蓝桥云课的镜像链接 http://labfile.oss.aliyuncs.com/courses/1445/cifar10,模仿前面实验中的例子进行使用。

from fastai.datasets import untar_data, URLs, download_data

download_data("http://labfile.oss.aliyuncs.com/courses/1445/cifar10")
data_path = untar_data(URLs.CIFAR)
data_path

接下来,请将 CIFAR10 数据集处理成 DataBunch 对象。挑战要求,将 train 文件夹中数据分离 20% 作为验证集,剩下数据作为训练集。test 文件夹下数据作为测试集。

from fastai.vision import ImageDataBunch
# 传入数据集路径,以及指定路径下训练集和测试集文件夹名称,指定验证集比例
data_bunch = ImageDataBunch.from_folder(data_path, train='train', test='test', valid_pct=0.2)
data_bunch

因数据会随机打乱,期望输出中的标签可能会与你的输出有所不同。
现在,我们可以预览数据。请以 3x3 的网格预览前 9 张图像。

# 传入预览行数,图像尺寸
data_bunch.show_batch(3, figsize=(5, 5))

因数据会随机打乱,期望输出中的图像可能会与你的输出有所不同。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容