将 Catalyst 与 fastai 结合使用

逐步将 fastai 的优点添加到您的 Catalyst 训练中
from fastai.vision.all import *

Catalyst 代码

我们将使用 Catalyst README(截至 2020 年 8 月)中的 MNIST 训练代码,并将其转换为一个模块。

注意

如果您从 git 检出了 `fastai` 仓库,`migrating_catalyst` 的源脚本位于此文件夹的 `examples` 子目录中,或者如果您使用 Colab 等在线查看器,可以从此处下载。

from migrating_catalyst import *

要在 fastai 中使用它,我们首先将 Catalyst 字典转换为 `DataLoaders` 对象

data = DataLoaders(loaders['train'], loaders['valid']).cuda()

使用回调

在 Catalyst 代码中,训练循环是手动定义的,输入张量在此处被展平。在 fastai 中,无需定义您自己的训练循环——您可以通过使用回调将您自己的代码插入到训练过程的任何部分,回调甚至可以修改训练循环中的数据、梯度、损失函数或任何其他内容

@before_batch_cb
def cb(self, xb, yb): return (xb[0].view(xb[0].size(0), -1),),yb

Catalyst 示例也修改了训练循环以添加指标,但您可以将这些指标直接传递给 fastai 中的 `Learner`

metrics=[accuracy,top_k_accuracy]
learn = Learner(data, model, loss_func=F.cross_entropy, opt_func=Adam,
                metrics=metrics, cbs=cb)

您现在可以拟合模型了。fastai 支持许多调度器。我们建议使用 1cycle

learn.fit_one_cycle(1, 0.02)
周期 训练损失 验证损失 准确率 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()` 从训练循环中提取出来并放入模型中

model = nn.Sequential(
    Flatten(),
    torch.nn.Linear(28 * 28, 10))

我们现在可以创建一个 `Learner` 并在不使用任何回调的情况下进行训练

learn = Learner(data, model, loss_func=F.cross_entropy, opt_func=Adam, metrics=metrics)
learn.fit_one_cycle(1, 0.02)
周期 训练损失 验证损失 准确率 top_k 准确率 时间
0 0.230051 0.292577 0.924800 0.995100 00:11