We're going to use the MNIST training code from 闪电's 'Quick Start' (as at August 2020), converted to a module. See migrating_lightning.py
for the 闪电 code we are importing here.
from migrating_lightning import *
from 法泰.vision.all import *
我们可以直接使用闪电模块:
model = LitModel()
要在fastai中使用它,我们首先将DataLoader从模块中拉到 数据加载器s
目的:
data = 数据加载器s(model.train_dataloader(), model.val_dataloader()).cuda()
我们现在可以创建一个 学习者
适合:
learn = 学习者(data, model, loss_func=F.cross_entropy, opt_func=Adam, metrics=准确性)
learn.fit_one_cycle(1, 0.001)
如您所见,从Lightning迁移使我们减少了代码量,并且不需要更改任何现有的数据管道,优化器,损失函数,模型等。进行了此更改之后,您可以然后可以从fastai丰富的回调,转换,可视化等集合中受益。
例如,在Lightning示例中,Tensorboard支持被定义为特殊情况的“记录器”。在Fastai中,Tensorboard只是另一个 Callback
that you can add, with the parameter cbs=Tensorboard
, when you create your 学习者
。所有回调都可以一起使用,因此您可以添加删除所有调度程序,记录器,可视化器等。您不必了解每种功能的特殊类型-它们都只是简单的回调。
请注意,fastai与Lightning的区别非常大,它不仅仅是一个训练循环(尽管在此示例中我们仅使用训练循环)-它是一个完整的框架,包括GPU加速的转换,端到端的转换。终端推理,视觉,文本,表格和协作过滤等集成应用程序。您可以单独使用框架的任何部分,也可以将它们组合在一起,如 法纸.
闪电示例中的一个问题是它实际上没有使用验证集-只是第二次使用训练集作为验证集。
您可能更喜欢使用fastai的Data Block API,这使创建,可视化和测试输入数据处理变得非常容易。例如,这是如何为MNIST创建输入数据的方法:
mnist = 数据Block(blocks=(ImageBlock(cls=PILImageBW), CategoryBlock),
get_items=get_image_files,
splitter=GrandparentSplitter(),
get_y=parent_label)
在这里,我们告诉 数据Block
我们有一个B&在图像输入和类别输出中,我们的输入项是图像的文件名,图像根据父文件夹的名称进行标记,并通过训练与基于祖父母文件夹名称的验证进行拆分。实际查看您的数据很重要,因此fastai还可轻松使您的输入和输出可视化,例如:
dls = mnist.dataloaders(untar_data(URLs.MNIST_TINY))
dls.show_batch(max_n=9, figsize=(4,4))