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 模块之间的依赖关系,部分模块我们没有介绍,不过你可以通过字面意思简单理解。
其中,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() # 进一步查看目录结构
可以看到,训练和测试数据分别放置在 training
和 testing
文件夹中,而不同类别的样本使用单独子文件夹存放。当然,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)
,所以需要传入训练集和验证集。如果你的路径下文件夹名称以 train
和 valid
这样的规范名称命名,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_folder
,from_csv
,from_df
,from_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 彩色图像。
接下来,请从 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))
因数据会随机打乱,期望输出中的图像可能会与你的输出有所不同。