快速入门

from fastai.vision.all import *
from fastai.text.all import *
from fastai.collab import *
from fastai.tabular.all import *

fastai 的应用都使用相同的基本步骤和代码

在本快速入门中,我们将展示针对各种不同应用和数据集的这些步骤。你会看到,尽管使用的模型和数据差异很大,每种情况下的代码都非常相似。

计算机视觉分类

下面的代码完成以下事情

  1. 一个名为 Oxford-IIIT Pet Dataset 的数据集,其中包含 37 个不同品种的 7,349 张猫狗图像,将从 fast.ai 数据集集合下载到你正在使用的 GPU 服务器上,然后进行提取。
  2. 一个已经使用竞赛获胜模型在 130 万张图像上训练过的预训练模型将从互联网下载。
  3. 将使用迁移学习的最新进展对预训练模型进行微调,以创建一个专门用于识别猫狗的模型。

前两个步骤只需运行一次。如果你再次运行,它将使用已经下载的数据集和模型,而不会重新下载。

path = untar_data(URLs.PETS)/'images'

def is_cat(x): return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(224))

learn = vision_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)
周期 训练损失 验证损失 错误率 时间
0 0.173790 0.018827 0.005413 00:12
周期 训练损失 验证损失 错误率 时间
0 0.064295 0.013404 0.005413 00:14

你可以使用 predict 方法对模型进行推理

img = PILImage.create('images/cat.jpg')
img

is_cat,_,probs = learn.predict(img)
print(f"Is this a cat?: {is_cat}.")
print(f"Probability it's a cat: {probs[1].item():.6f}")
Is this a cat?: True.
Probability it's a cat: 0.999722

计算机视觉分割

下面是如何使用 fastai 训练分割模型,使用 Camvid 数据集的一个子集

path = untar_data(URLs.CAMVID_TINY)
dls = SegmentationDataLoaders.from_label_func(
    path, bs=8, fnames = get_image_files(path/"images"),
    label_func = lambda o: path/'labels'/f'{o.stem}_P{o.suffix}',
    codes = np.loadtxt(path/'codes.txt', dtype=str)
)

learn = unet_learner(dls, resnet34)
learn.fine_tune(8)
周期 训练损失 验证损失 时间
0 2.882460 2.096923 00:03
周期 训练损失 验证损失 时间
0 1.602270 1.543582 00:02
1 1.417732 1.225782 00:02
2 1.307454 1.071090 00:02
3 1.170338 0.884501 00:02
4 1.047036 0.799820 00:02
5 0.947965 0.754801 00:02
6 0.868178 0.728161 00:02
7 0.804939 0.720942 00:02

我们可以通过让模型对图像的每个像素进行颜色编码来可视化它完成任务的效果。

learn.show_results(max_n=6, figsize=(7,8))

或者我们可以使用 SegmentationInterpretation 类绘制对验证损失贡献最大的 k 个实例。

interp = SegmentationInterpretation.from_learner(learn)
interp.plot_top_losses(k=2)

自然语言处理

这是训练一个模型的全部所需代码,该模型对电影评论情感的分类效果比五年前世界上存在的任何模型都要好

dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test')
learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy)
learn.fine_tune(2, 1e-2)
周期 训练损失 验证损失 准确率 时间
0 0.594912 0.407416 0.823640 01:35
周期 训练损失 验证损失 准确率 时间
0 0.268259 0.316242 0.876000 03:03
1 0.184861 0.246242 0.898080 03:10
2 0.136392 0.220086 0.918200 03:16
3 0.106423 0.191092 0.931360 03:15

预测使用 predict 进行,与计算机视觉一样

learn.predict("I really liked that movie!")
('pos', tensor(1), tensor([0.0041, 0.9959]))

表格数据

从纯表格数据构建模型使用与之前模型相同的基本步骤。这是训练一个模型的所需代码,该模型将根据社会经济背景预测一个人是否是高收入者

path = untar_data(URLs.ADULT_SAMPLE)

dls = TabularDataLoaders.from_csv(path/'adult.csv', path=path, y_names="salary",
    cat_names = ['workclass', 'education', 'marital-status', 'occupation',
                 'relationship', 'race'],
    cont_names = ['age', 'fnlwgt', 'education-num'],
    procs = [Categorify, FillMissing, Normalize])

learn = tabular_learner(dls, metrics=accuracy)
learn.fit_one_cycle(2)
周期 训练损失 验证损失 准确率 时间
0 0.372298 0.359698 0.829392 00:06
1 0.357530 0.349440 0.837377 00:06

推荐系统

推荐系统非常重要,尤其在电子商务领域。像亚马逊和 Netflix 这样的公司努力推荐用户可能喜欢的产品或电影。下面是训练一个模型的步骤,该模型将使用 MovieLens 数据集,根据用户的观看习惯预测他们可能喜欢的电影

path = untar_data(URLs.ML_SAMPLE)
dls = CollabDataLoaders.from_csv(path/'ratings.csv')
learn = collab_learner(dls, y_range=(0.5,5.5))
learn.fine_tune(6)
周期 训练损失 验证损失 时间
0 1.497551 1.435720 00:00
周期 训练损失 验证损失 时间
0 1.332337 1.351769 00:00
1 1.180177 1.046801 00:00
2 0.913091 0.799319 00:00
3 0.749806 0.731218 00:00
4 0.686577 0.715372 00:00
5 0.665683 0.713309 00:00

我们可以使用之前看到的相同 show_results 调用,来查看一些用户和电影 ID、实际评分和预测的示例

learn.show_results()
用户 ID 电影 ID 评分 预测评分
0 5.0 3.0 2.0 3.985477
1 1.0 62.0 4.0 3.629225
2 91.0 81.0 1.0 3.476280
3 48.0 26.0 2.0 4.043919
4 75.0 54.0 3.0 4.023057
5 42.0 22.0 3.0 3.509050
6 40.0 59.0 4.0 3.686552
7 63.0 77.0 3.0 2.862713
8 32.0 61.0 4.0 4.356578