from fastai.vision.all import *
将 Catalyst 与 fastai 结合使用
Catalyst 代码
我们将使用 Catalyst README(截至 2020 年 8 月)中的 MNIST 训练代码,并将其转换为一个模块。
如果您从 git 检出了 `fastai` 仓库,`migrating_catalyst` 的源脚本位于此文件夹的 `examples` 子目录中,或者如果您使用 Colab 等在线查看器,可以从此处下载。
from migrating_catalyst import *
要在 fastai 中使用它,我们首先将 Catalyst 字典转换为 `DataLoaders` 对象
= DataLoaders(loaders['train'], loaders['valid']).cuda() data
使用回调
在 Catalyst 代码中,训练循环是手动定义的,输入张量在此处被展平。在 fastai 中,无需定义您自己的训练循环——您可以通过使用回调将您自己的代码插入到训练过程的任何部分,回调甚至可以修改训练循环中的数据、梯度、损失函数或任何其他内容
@before_batch_cb
def cb(self, xb, yb): return (xb[0].view(xb[0].size(0), -1),),yb
Catalyst 示例也修改了训练循环以添加指标,但您可以将这些指标直接传递给 fastai 中的 `Learner`
=[accuracy,top_k_accuracy]
metrics= Learner(data, model, loss_func=F.cross_entropy, opt_func=Adam,
learn =metrics, cbs=cb) metrics
您现在可以拟合模型了。fastai 支持许多调度器。我们建议使用 1cycle
1, 0.02) learn.fit_one_cycle(
周期 | 训练损失 | 验证损失 | 准确率 | top_k 准确率 | 时间 |
---|---|---|---|---|---|
0 | 0.230145 | 0.292590 | 0.924700 | 0.995000 | 00:13 |
正如您所见,从 Catalyst 迁移使我们能够用仅仅 3 行代码替换 `CustomRunner` 中的 17 行代码,并且不需要您更改任何现有的数据管道、优化器、损失函数、模型等。完成此更改后,您就可以受益于 fastai 丰富的回调、转换、可视化等功能。
请注意,fastai 与 Catalyst 非常不同,因为它不仅仅是一个训练循环(尽管在此示例中我们只使用了训练循环)——它是一个完整的框架,包括 GPU 加速的转换、端到端推理、用于视觉、文本、表格和协同过滤的集成应用等。您可以单独使用该框架的任何部分,或将它们组合在一起,如fastai 论文中所述。
更改模型
在这种情况下,您也可以简单地改变模型,而不是使用回调。在这里,我们使用 fastai 的 `Flatten` 层将 `view()` 从训练循环中提取出来并放入模型中
= nn.Sequential(
model
Flatten(),28 * 28, 10)) torch.nn.Linear(
我们现在可以创建一个 `Learner` 并在不使用任何回调的情况下进行训练
= Learner(data, model, loss_func=F.cross_entropy, opt_func=Adam, metrics=metrics)
learn 1, 0.02) learn.fit_one_cycle(
周期 | 训练损失 | 验证损失 | 准确率 | top_k 准确率 | 时间 |
---|---|---|---|---|---|
0 | 0.230051 | 0.292577 | 0.924800 | 0.995100 | 00:11 |