pytorch调参经验(一)

实验1——cifar10

最近为了学习调参,跑了一遍cifar10,用pytorch编写的代码。

由于自己用的是1080ti,所以结果能比较快地显现。

首先设置lr=0.01,但是没跑多久正确率机会都不变,同时loss不降反升,因此只能调低lr=0.001,然而还是不行。这时继续调低lr至1e-4。 此时正确率慢慢爬升了,而且loss也在慢慢下降。但是这些过程进行地很缓慢,10个Epoch训练集正确率也才到40%.

调整

调了许多东西,调整了BatchSize,增大到128个,能增长稍微快一点但是快地不多。

试着调整了优化器,由Adam改为了SGD,还改变了里面地参数,比如moment、weight_decay,但结果都是变化地不太大。

接着修改了lr_scheduler但这对于我们一开始训练效果差并没有影响。显然这也是无效的。

此时我甚至考虑是否需要修改网络结构,但我使用的是已有的模型ResNet18,应该问题不大。

结果

最终的结果是
在使用pytorch的时候,模型参数的更新时,优化器Optim需要采用下述操作:optim.zero_grad().就是将模型参数的梯度值清零。

结果特别明显:10个epoch,训练集的正确率就可以达到85%多。30个epoch就已经训练集达到95%以上。但测试集效果不佳,正确率只有83%多。

调参

上述结果,训练集达到了100%,但测试集只有83%,显然是过拟合。对比自己手上有的已开源的代码,我们做了一系列的改变,这里的改变是指能正则化的改变。这些对结果的改变不大。

接着我发现了一处唯一的区别,开源代码中的数据增强中用到了Randomcrop(32,padding=4),而我只采用Resize((32,32)).
结果的区别是,训练集的正确率达到93.6%时,测试集的正确率达到87.72%。
原因是:
链接

神经网络的学习或者说参数估计本质就是建立输入X与输出Y的统计关系,其往往需要大量的数据,但是我们用大量的数据学习到的模型是否稳定??由于神经网络是黑箱的,我们比较难以用数学原理推断模型的稳定性。比如在人脸识别时,我们人可以通过以一颗痣就能很好地辨别这个人,但在网络上我们只能给他足够多地数据才能在统计意义上使其关注这个痣。

上述博客中举了【俄罗斯坦克问题】
就是在训练电脑识别一个物体时,我们人眼可以很容易从数据提取出区分两类地特征,而神经网络这个黑箱可能会从另外一个角度出发区分两类,但这个角度很有可能不是图像中物体地特征,而是这个数据(图像)的特征。比如该博客中说的,美国坦克的图像是高清的,而俄罗斯坦克是模糊的。神经网络训练识别两类坦克的方法可能就是学习区分模糊和清晰的照片。

因此可以看到我们用神经网络训练时存在这样的问题,这个问题实际就是我们的目的和我们给的数据不符合,即我们给了模型错误的数据。【俄罗斯坦克问题】本质上是一个集合中的概率问题,我们假设训练图片包含因子特征:
符号标记:

  • 俄罗斯坦克A,美国坦克B
  • 模糊X,清晰Y
  • 类别标签,俄罗斯坦克为$C_a$,美国坦克为$C_b$
    所以俄罗斯坦克的图片为$I_a$={A,X},美国坦克的图片为$I_b$={B,Y};
    这里存在多映射关系即我们的目的是给定图片学习A——>$C_a$及B——>$C_b$的映射关系,但是如果模型建立了X——>$C_a$,Y——>$C_b$的映射关系,我们也无法检测出模型学习了与我们的目的不符的映射。我们需要图片$I_c$={A,Y}或$I_d$={B,X}才能测试模型的正确性。

这就是我们在上面提到的要解决数据特征对我们图像中的物体特征的影响。

在数据中加入因子X或Y,即数据变为

  • 俄罗斯坦克的图片为:$I_a={A,X},I_c={A,Y}$
  • 美国坦克的图片为:$I_b={B,Y},I_d={B,X}$
    这个时候当X和Y在每类均匀分布的时候,X和Y被视为噪音,即所以X,Y对分类的信息增益为0,即X,Y无预测能力,这时我们才正确建立了与我们目的相符的映射关系。

回到刚开始的问题,深度学习训练中对图片用随机裁剪的好处?
这个裁剪不仅仅是增加数据量,如上文所述也是一种弱化数据噪声与增加模型稳定性的方法。

比如我们假设:
二分类问题,C1类别主要特征为${E_1.F_1.G_1}$,C2为${E_2,F_2,G_2}$
我们增加背景数据噪声:C1,C2随机加入$N_1,N_2,N_3$
这个时候随机裁剪可以得到图片,如:
$I_1=\{E_1,F_1,G_1\}$
$I_2=\{E_1,F_1,G_1,N_1\}$
$I_3=\{E_1,F_1,N_2\}$
$I_4=\{F_1,G_1,N_3\}$
$……$
因为$N_1,N_2,N_3$为随机的而$E_1,F_1,G_1$总是能高概率产生$E_1,F_1,G_1——>C_1$的映射,这时$\{E_1,F_1,G_1\}$中任意因子相对于$N_1,N_2,N_3$有更高的信息增益或者权重。即:

如果$N_1,N_2,N_3$在类别$C_2$中也有相应的分布,那么$N_1,N_2,N_3$的信息增益接近于0.
假设模型未见过数据$I_x=\{F_1,G_1,N_1,N_3\}$,那么模型会如何预测该数据,通过上式我们可以看到$F_1,G_1$的权重是相当高的,即便是其他未见过的噪声加入,$F_1,G_1$因子的权重仍然起主要作用,所以模型有更高的稳定性。

随机裁剪相当于建立每个因子特征与相应类别的权重关系,减弱背景(或噪音)因子的权重,也可以产生更好的学习效果增加模型的稳定性。

最终结果

cifar10_1

AI Challenge 农作物病害检测

这个比赛是我10月底才刚刚看到的,刚上手就跑了一个resnet50.效果并不好,最终只有74%。之后看了该比赛论坛里开源出来的代码之后,做了一些修改,慢慢地能跑到83%。但还是不如网上排行榜里的成绩。之后就放弃了,开始了上面的cifar10的调参学习,才发现在这个模型里也有出现上述问题,最严重的就是那个optimizer.zero_grad()没写。修改之后,效果出奇地好,1个Epoch就达到了80%.最终训练结果是89%多。
plant
排行榜
plant_2
可以看到训练集上的正确率还没到达100%,因此算是欠拟合。可以继续加深网络。

-------------本文结束感谢您的阅读-------------

本文标题:pytorch调参经验(一)

文章作者:Yif Du

发布时间:2018年11月18日 - 00:11

最后更新:2019年03月13日 - 14:03

原始链接:http://yifdu.github.io/2018/11/18/pytorch调参经验(一)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。