【问题标题】:Training results are different for Classification using Pytorch APIs and Fast-ai使用 Pytorch API 和 Fast-ai 进行分类的训练结果不同
【发布时间】:2020-11-28 12:12:57
【问题描述】:

我有两个训练 python 脚本。一种使用 Pytorch 的 API 进行分类训练,另一种使用 Fast-ai。 使用 Fast-ai 的效果要好得多。

培训成果如下。

Fastai
epoch     train_loss  valid_loss  accuracy  time    
0         0.205338    2.318084    0.466482  23:02                         
1         0.182328    0.041315    0.993334  22:51                         
2         0.112462    0.064061    0.988932  22:47                         
3         0.052034    0.044727    0.986920  22:45                         
4         0.178388    0.081247    0.980883  22:45                         
5         0.009298    0.011817    0.996730  22:44                         
6         0.004008    0.003211    0.999748  22:43 

Using Pytorch
Epoch [1/10], train_loss : 31.0000 , val_loss : 1.6594, accuracy: 0.3568
Epoch [2/10], train_loss : 7.0000 , val_loss : 1.7065, accuracy: 0.3723
Epoch [3/10], train_loss : 4.0000 , val_loss : 1.6878, accuracy: 0.3889
Epoch [4/10], train_loss : 3.0000 , val_loss : 1.7054, accuracy: 0.4066
Epoch [5/10], train_loss : 2.0000 , val_loss : 1.7154, accuracy: 0.4106
Epoch [6/10], train_loss : 2.0000 , val_loss : 1.7232, accuracy: 0.4144
Epoch [7/10], train_loss : 2.0000 , val_loss : 1.7125, accuracy: 0.4295
Epoch [8/10], train_loss : 1.0000 , val_loss : 1.7372, accuracy: 0.4343
Epoch [9/10], train_loss : 1.0000 , val_loss : 1.6871, accuracy: 0.4441
Epoch [10/10], train_loss : 1.0000 , val_loss : 1.7384, accuracy: 0.4552

使用 Pytorch 不会收敛。 我使用了相同的网络 (Wideresnet22),两者都是从头开始训练的,没有预训练模型。

网络是here

使用 Pytorch 进行训练是here

Fastai的使用方法如下。

from fastai.basic_data import DataBunch
from fastai.train import Learner
from fastai.metrics import accuracy

#DataBunch takes data and internall create data loader
data = DataBunch.create(train_ds, valid_ds, bs=batch_size, path='./data')
#Learner uses Adam as default for learning
learner = Learner(data, model, loss_func=F.cross_entropy, metrics=[accuracy])
#Gradient is clipped
learner.clip = 0.1

#learner finds its learning rate
learner.lr_find()

learner.recorder.plot()

#Weight decay helps to lower down weight. Learn in https://towardsdatascience.com/
learner.fit_one_cycle(5, 5e-3, wd=1e-4)

我使用 Pytorch 的训练算法有什么问题?

【问题讨论】:

    标签: python pytorch fast-ai


    【解决方案1】:

    fastai 在幕后使用了很多技巧。快速了解他们在做什么而你没有。

    这些是我认为最重要的顺序,尤其是前两个应该会提高你的分数。

    TLDR

    使用一些调度程序(最好是torch.optim.lr_scheduler.CyclicLR)和AdamW 而不是SGD

    加长版

    fit_one_cycle

    1 cycle policy by Leslie Smith 用于fastai。在 PyTorch 中,可以使用 torch.optim.lr_scheduler.CyclicLR 创建类似的例程,但这需要一些手动设置。

    基本上它从较低的学习率开始,在您的情况下逐渐增加到5e-3,然后再次回到较低的学习率(循环)。您可以调整lr 的升降方式(在fastai 中,它使用余弦退火IIRC 来实现)。

    一开始你的学习率太高了,应该有一些调度器来帮忙,首先测试一下。

    优化器

    在提供的代码 sn-p 中,您使用 torch.optim.SGD(因为 optim_fnNone 并且已设置默认值)这很难正确设置(通常)。

    另一方面,如果你设法正确地手动设置它,你可能会更好地概括。

    还有fastai 默认情况下不使用Adam如果设置了true_wd,它将使用AdamW(我认为,无论如何,这将是您的默认情况,请参阅@987654326 @)。 AdamW 将权重衰减与自适应学习率解耦,这应该会提高收敛性(阅读 hereoriginal paper

    历元数

    如果要比较两种方法,请设置相同的 epoch 数,目前是苹果对橙子。

    渐变剪裁

    您不剪辑渐变(已被注释掉),这取决于任务可能有帮助或没有帮助。暂时不会关注那个。

    其他技巧

    阅读 Learnerfit_one_cycle 并尝试在 PyTorch 中设置类似的东西(上面描述的粗略指南)

    您也可以使用某种形式的数据增强来进一步提高分数,但我认为这超出了问题的范围。

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 2020-10-10
      • 2020-11-20
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2023-01-18
      • 2015-03-12
      相关资源
      最近更新 更多