from fastai.vision.all import *
from fastai.text.all import *
from fastai.collab import *
from fastai.tabular.all import *
快速入门
fastai 的应用都使用相同的基本步骤和代码
- 创建适当的
DataLoaders
- 创建一个
Learner
- 调用 fit 方法
- 进行预测或查看结果。
在本快速入门中,我们将展示针对各种不同应用和数据集的这些步骤。你会看到,尽管使用的模型和数据差异很大,每种情况下的代码都非常相似。
计算机视觉分类
下面的代码完成以下事情
- 一个名为 Oxford-IIIT Pet Dataset 的数据集,其中包含 37 个不同品种的 7,349 张猫狗图像,将从 fast.ai 数据集集合下载到你正在使用的 GPU 服务器上,然后进行提取。
- 一个已经使用竞赛获胜模型在 130 万张图像上训练过的预训练模型将从互联网下载。
- 将使用迁移学习的最新进展对预训练模型进行微调,以创建一个专门用于识别猫狗的模型。
前两个步骤只需运行一次。如果你再次运行,它将使用已经下载的数据集和模型,而不会重新下载。
= untar_data(URLs.PETS)/'images'
path
def is_cat(x): return x[0].isupper()
= ImageDataLoaders.from_name_func(
dls =0.2, seed=42,
path, get_image_files(path), valid_pct=is_cat, item_tfms=Resize(224))
label_func
= vision_learner(dls, resnet34, metrics=error_rate)
learn 1) learn.fine_tune(
周期 | 训练损失 | 验证损失 | 错误率 | 时间 |
---|---|---|---|---|
0 | 0.173790 | 0.018827 | 0.005413 | 00:12 |
周期 | 训练损失 | 验证损失 | 错误率 | 时间 |
---|---|---|---|---|
0 | 0.064295 | 0.013404 | 0.005413 | 00:14 |
你可以使用 predict
方法对模型进行推理
= PILImage.create('images/cat.jpg')
img img
= learn.predict(img)
is_cat,_,probs 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 数据集的一个子集
= untar_data(URLs.CAMVID_TINY)
path = SegmentationDataLoaders.from_label_func(
dls =8, fnames = get_image_files(path/"images"),
path, bs= lambda o: path/'labels'/f'{o.stem}_P{o.suffix}',
label_func = np.loadtxt(path/'codes.txt', dtype=str)
codes
)
= unet_learner(dls, resnet34)
learn 8) learn.fine_tune(
周期 | 训练损失 | 验证损失 | 时间 |
---|---|---|---|
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 |
我们可以通过让模型对图像的每个像素进行颜色编码来可视化它完成任务的效果。
=6, figsize=(7,8)) learn.show_results(max_n
或者我们可以使用 SegmentationInterpretation
类绘制对验证损失贡献最大的 k
个实例。
= SegmentationInterpretation.from_learner(learn)
interp =2) interp.plot_top_losses(k
自然语言处理
这是训练一个模型的全部所需代码,该模型对电影评论情感的分类效果比五年前世界上存在的任何模型都要好
= TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test')
dls = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy)
learn 2, 1e-2) learn.fine_tune(
周期 | 训练损失 | 验证损失 | 准确率 | 时间 |
---|---|---|---|---|
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
进行,与计算机视觉一样
"I really liked that movie!") learn.predict(
('pos', tensor(1), tensor([0.0041, 0.9959]))
表格数据
从纯表格数据构建模型使用与之前模型相同的基本步骤。这是训练一个模型的所需代码,该模型将根据社会经济背景预测一个人是否是高收入者
= untar_data(URLs.ADULT_SAMPLE)
path
= TabularDataLoaders.from_csv(path/'adult.csv', path=path, y_names="salary",
dls = ['workclass', 'education', 'marital-status', 'occupation',
cat_names 'relationship', 'race'],
= ['age', 'fnlwgt', 'education-num'],
cont_names = [Categorify, FillMissing, Normalize])
procs
= tabular_learner(dls, metrics=accuracy)
learn 2) learn.fit_one_cycle(
周期 | 训练损失 | 验证损失 | 准确率 | 时间 |
---|---|---|---|---|
0 | 0.372298 | 0.359698 | 0.829392 | 00:06 |
1 | 0.357530 | 0.349440 | 0.837377 | 00:06 |
推荐系统
推荐系统非常重要,尤其在电子商务领域。像亚马逊和 Netflix 这样的公司努力推荐用户可能喜欢的产品或电影。下面是训练一个模型的步骤,该模型将使用 MovieLens 数据集,根据用户的观看习惯预测他们可能喜欢的电影
= untar_data(URLs.ML_SAMPLE)
path = CollabDataLoaders.from_csv(path/'ratings.csv')
dls = collab_learner(dls, y_range=(0.5,5.5))
learn 6) learn.fine_tune(
周期 | 训练损失 | 验证损失 | 时间 |
---|---|---|---|
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 |