FastAI

技术栈
AI 框架
deep-learningpytorchhigh-leveltransfer-learningvisiontab-data

概览

FastAI

FastAI 是由 Jeremy Howard 和 Rachel Thomas 创建的PyTorch 顶层深度学习框架,核心理念是"让深度学习民主化"。它基于类型派发(type dispatch)将最佳实践自动应用到各任务类型上,用 4 行代码训练出 SOTA 模型。

核心价值:

  • 傻瓜式训练vision_learner(dls, resnet18, metrics=accuracy) + fine_tune(3) 搞定
  • 自动最佳实践:自动 lr、自动混合精度、差分学习率、渐进式解冻
  • DataBlock API:声明式构造数据管道,告别手写 Dataset
  • 内置 SOTA 技巧:MixUp / Label Smoothing / TTA 开箱即用
  • 配套教材:free 在线课程《Practical Deep Learning for Coders》

适用场景: 快速图像分类/分割、迁移学习、Kaggle 入门、教学演示。

安装

环境准备

  • Python:>= 3.9(推荐 3.10)
  • PyTorch:自动作为依赖安装
  • GPU:NVIDIA CUDA(推荐,CPU 也可但慢)
  • 系统:Linux 最佳,macOS/Windows 也可

安装命令

一键安装

pip install fastai

这会自动安装 PyTorch、torchvision、fastdownload 等全套依赖。

验证安装

from fastai.vision.all import *

path = untar_data(URLs.PETS)  # 首次运行下载 Oxford Pets 数据集
dls = ImageDataLoaders.from_name_re(
    path, get_image_files(path/"images"), 
    pat=r'^(.*)_\d+\.jpg$', item_tfms=Resize(224), bs=32
)
learn = vision_learner(dls, resnet18, metrics=accuracy)
learn.fine_tune(1)
print("FastAI 安装成功!")

Apple Silicon (M1/M2/M3)

# 使用 MPS 后端
pip install fastai
# 在代码中 device='mps',或通过 accelerate 自动检测

常见安装问题

Q1: ImportError: cannot import name 'vision_learner'

fastai 未完整安装。运行 pip install -U fastai 升级到最新版本。

Q2: CUDA Out of Memory

bs(batch_size)默认可能是 64。在 ImageDataLoaders 中减小 bs:bs=16

Q3: 数据集下载失败

FastAI 数据集来自 AWS S3,国内可能慢。手动下载到 ~/.fastai/data/ 目录,或使用自己的数据集。

示例

FastAI 宠物品种分类:4 行代码 SOTA

目标

用 FastAI 的高级 API,仅 4 行核心代码训练一个 37 种宠物品种分类模型(Oxford-IIIT Pet Dataset)。

完整代码

from fastai.vision.all import *

# ─── 第 1 行:下载数据 ───
path = untar_data(URLs.PETS)

# ─── 第 2 行:声明式数据管道 ───
dls = ImageDataLoaders.from_name_re(
    path,                           # 数据根目录
    get_image_files(path/"images"), # 所有图片
    pat=r'^(.*)_\d+\.jpg$',        # 正则提取:品种_编号.jpg → 品种
    item_tfms=Resize(460),          # 先统一大小
    batch_tfms=aug_transforms(size=224, min_scale=0.75),  # 数据增强
    bs=64,                          # batch size
)

# 查看数据
dls.show_batch(max_n=6, nrows=2)
# plt.show()

# ─── 第 3 行:创建学习器 ───
learn = vision_learner(
    dls,
    resnet34,                   # backbone:ResNet-34 预训练权重
    metrics=[accuracy, error_rate],
    # 自动:差分学习率、混合精度、LabelSmoothing
)

# ─── 第 4 行:训练! ───
learn.fine_tune(5)              # 5 epoch:1 epoch 训练 head + 4 epoch 微调全部

# ─── 预测 ───
img = PILImage.create("my_cat.jpg")
breed, _, probs = learn.predict(img)
print(f"品种: {breed} (置信度: {probs.max():.2%})")

# ─── 混淆矩阵 ───
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix(figsize=(12, 12))
# interp.plot_top_losses(9)  # 看最差的预测

运行步骤

pip install fastai
python fastai_pets.py

首次运行自动下载数据集(~800 MB)和 ResNet34 预训练权重(~80 MB)。

预期输出

epoch   train_loss  valid_loss  error_rate  accuracy  time
0       1.245       0.678       0.212       0.788     00:45
1       0.567       0.398       0.124       0.876     00:48
2       0.345       0.312       0.098       0.902     00:47
...
epoch   train_loss  valid_loss  error_rate  accuracy  time
0       0.234       0.278       0.089       0.911     01:02
...
4       0.056       0.198       0.064       0.936     01:01

品种: Ragdoll (置信度: 97.34%)

教程

FastAI 入门教程:DataBlock 与 lr_find

1. FastAI 的哲学

FastAI 的三条原则:

  1. 类型派发(type dispatch):框架检测你的数据类型(图像/文本/表格),自动应用最佳增强和预处理
  2. 最佳实践内置fine_tune() 内含差分学习率、渐进式解冻、1-cycle 策略
  3. 声明式 > 命令式:描述"数据长什么样"而非"如何加载数据"

2. DataBlock:声明式数据管道

from fastai.vision.all import *

pets = DataBlock(
    blocks=(ImageBlock, CategoryBlock),           # 输入是图像,输出是类别
    get_items=get_image_files,                     # 如何获取所有样本
    splitter=RandomSplitter(seed=42),              # 如何划分训练/验证
    get_y=using_attr(RegexLabeller(r'^(.*)_\d+\.jpg$'), 'name'),  # 如何获取标签
    item_tfms=Resize(460),                         # 每个样本的变换
    batch_tfms=aug_transforms(size=224),          # 批量变换(含数据增强)
)
dls = pets.dataloaders(path/"images", bs=64)

DataBlock 的五要素:

要素 API 说明
blocks (ImageBlock, CategoryBlock) 输入/输出类型
get_items get_image_files 如何找数据
splitter RandomSplitter(0.2) 如何分集
get_y RegexLabeller(...) 如何提取标签
transforms item_tfms / batch_tfms 数据变换

3. lr_find:自动找最佳学习率

learn = vision_learner(dls, resnet34, metrics=accuracy)
lr_min, lr_steep = learn.lr_find(suggest_funcs=(minimum, steep))
print(f"建议 lr: {lr_steep:.2e}")

规则:选择 loss 曲线最陡下降点,或 loss 最小点 ÷ 10。FastAI 的 fine_tune() 自动调用 lr_find。

4. fine_tune 内部原理

# learn.fine_tune(5) 等价于:

# Phase 1: 冻结 backbone,只训练 head(1 epoch)
learn.fit_one_cycle(1, lr_max=lr)       # 使用 lr_find 找到的 lr

# Phase 2: 解冻全部,差分学习率微调(4 epoch)
learn.unfreeze()
learn.fit_one_cycle(4, lr_max=slice(lr/100, lr/10))  # head 用 lr/10,backbone 用 lr/100

slice(a, b) 表示:最后层 lr=b,第一层 lr=a,中间指数衰减。这是 FastAI 最精妙的设计之一。

5. 常见任务速查

任务 模块 典型代码
图像分类 fastai.vision vision_learner(dls, resnet34)
图像分割 fastai.vision unet_learner(dls, resnet34)
文本分类 fastai.text text_classifier_learner(dls, AWD_LSTM)
表格数据 fastai.tabular tabular_learner(dls, layers=[200,100])
协同过滤 fastai.collab collab_learner(dls, n_factors=50)

6. 测试时增强 (TTA)

preds, targs = learn.tta()  # 对测试样本做多个增强版本取平均
accuracy(preds, targs)

TTA 通常在验证集上提升 0.5%-2% 准确率,零成本。

7. FastAI vs Keras vs PyTorch 原生

维度 FastAI Keras PyTorch
上手速度 ⭐⭐⭐ ⭐⭐
内置 SOTA 技巧 ⭐⭐⭐
自定义灵活性 ⭐⭐ ⭐⭐ ⭐⭐⭐
生产部署 ⭐⭐ ⭐⭐⭐ ⭐⭐⭐
教材配套 ⭐⭐⭐(免费课) ⭐⭐

思考题

  1. slice(lr/100, lr/10) 的差分学习率为什么 head 大、backbone 小?
  2. DataBlock API 相比手写 PyTorch Dataset 的优势和局限是什么?
  3. 什么时候用 fine_tune,什么时候用 fit_one_cycle

参考资料

暂无参考文献