![73f6568a14608d2b60d757b94a375e77.png](https://i-blog.csdnimg.cn/blog_migrate/bd74dc8256dcfb84bcf6ffd3adc3b105.jpeg)
这篇文章总结了CNN分类任务常见的调参tricks,如网络结构调优,标签平滑,warm up等,并放了Amazon WEB团队验证的论文实验结果,具有 较大的工程意义。
零,前言
训练过程的改进可以提高在图像分类研究中的效果,例如通过研究数据增强和优化的方法。本文我们将研究这些改进的集合,通过将这些改进组合在一起,我们可以显着改善各种CNN模型。
Amazon WEB团队 Bag of Tricks for Image Classification with CNN (https://arxiv.org/abs/1812.01187)将在ImageNet上ResNet-50的top-1验证准确性从75.3%提高到79.29%。本文主要学习上面论文中提到的方法,并加上了自己训练网络时比较常用的一些思路。对常见的调参方法进行总结。
一,模型训练加速
模型训练加速一是使用更大的Batch Size,二是使用低精度(如FP16)进行训练(混合精度训练)。但在论文中提到,只是单纯地增加Batch Size,并不会有什么提升。
- 增大学习率。更大的Batch Size可以使每个Batch数据计算的梯度更加贴近整个数据集,从侧面提高学习率。实际实验中我发现对GPU的负载会有升高。如果你是在自己的电脑上跑,6G显存,跑resnet152-v2设置16以下的batchsize会比较好,否则收敛会比较困难。
- 热身Warm up。Warm up指的是用一个小的学习率先训练几个epoch,这是因为网络的参数是随机初始化的,一开始就采用较大的学习率容易数值不稳定。
- 每一个残差块后的最后一个BN层的
参数初始化为0
,
参数是在线性变换过程中的参数,公式表示为:
,一般我们会把
设为1,而论文作者表示
会更好一点
作者将上面的Tricks结合在一起进行训练。使用低精度(16-Bit浮点型)来混合精度训练。下面的图展示了应用了trick后对于baseline的训练速度的提升,训练精度也有提升。
![d73a2c2f211d56350b8862e887fcfaf6.png](https://i-blog.csdnimg.cn/blog_migrate/afac0e3be7a92c576b81738d7cf741a0.jpeg)
二,网络结构调优
对于比较常见的ResNet-50,可以参考Amazon WEB对ResNet-50进行了魔改形成了三种结构,分别是ResNet-50-A、ResNet-50-B、ResNet-50-C,下图是ResNet网络的原始结构图,其中输入流和每个stage的详细结构在中间那列,而残差结构写在最右边。
ResNet-B修改了Resnet的下采样模块。 ResNet-C进一步修改了输入系统。 作者特别强调ResNet-D再次修改了下采样模块。这里主要讨论B和D。
ResNet-B在原始结构中路径A中的卷积会忽略输入特征图的四分之三,ResNet-B切换路径A中前两个卷积的步幅大小,因此不会忽略任何信息。 并且由于第二次卷积的核大小为3×3,因此路径A的输出形状保持不变。
ResNet-D受ResNet-B的启发,在下采样块路径B中的1×1卷积也忽略了3/4个输入特征图, 根据经验,作者发现在卷积之前添加一个2×2的平均池化层,跨度为2,其步长更改为1,在实践中效果很好,并且对计算成本的影响很小。
![e343a5a72a37dc99bfce2cbaac57a378.png](https://i-blog.csdnimg.cn/blog_migrate/386d31ad584b4bdacfc7499d64fb154b.png)
![81364f03c257239af5500d33b8a7046f.png](https://i-blog.csdnimg.cn/blog_migrate/b8cf867554d7560dc94ec1b11440c243.jpeg)
作者随之做了实验,通过改进的网络结构与baseline相比的效果如下所示,效果还是可以的。
![716f26fccb2ae463f38b6c1578e24b69.png](https://i-blog.csdnimg.cn/blog_migrate/3909eca484a04628643e4a03adec45fe.jpeg)
三,模型训练调参
作者提到了四个方面,分别是采用cosine函数作为学习率衰减策略、标签平滑、知识蒸馏、Mixup数据增强。
- Cosine Decay compared to Step Decay
Cosine衰减的公式为:
![9ea468ef4de70baaff49daa3b3334cad.png](https://i-blog.csdnimg.cn/blog_migrate/670742e9a502d76de1333aa97bd92f8b.png)
作者的实验结果如下,图a说明这两种方法学习率的区别,图b说明对准确率的影响。
![741d4a47e9d3c19a6b9fed17946d1ec6.png](https://i-blog.csdnimg.cn/blog_migrate/5b5a06899dc1b38c5b910ff0714fad74.jpeg)
2. 标签平滑
对于分类问题,尤其是多类别分类问题中,常常把类别向量做成one-hot。会造成过拟合等问题。可以通过标签平滑降低一些分类过于准确的程度。
![a90147b71caba049433c8ce679b94c76.png](https://i-blog.csdnimg.cn/blog_migrate/60cef06a47193c9231e4367a955f80f8.png)
#标签平滑的代码(https://www.jianshu.com/p/b9684ced5e33)
import torch
import torch.nn as nn
class LabelSmoothing(nn.Module):
def __init__(self, smoothing=0.0):
super(LabelSmoothing, self).__init__()
self.confidence = 1.0 - smoothing
self.smoothing = smoothing
def forward(self, x, target):
logprobs = torch.nn.functional.log_softmax(x, dim=-1)
nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1))
nll_loss = nll_loss.squeeze(1)
smooth_loss = -logprobs.mean(dim=-1)
loss = self.confidence * nll_loss + self.smoothing * smooth_loss
return loss.mean()
展示一下作者实验的效果,也是不错的。使用Label Smooth来软化一下,可以降低对标签为1的数据的过度信任:
![b1eace53f1ddd3b1cc6cfb58da2de686.png](https://i-blog.csdnimg.cn/blog_migrate/8f4fd113860a091828902c36945325b8.png)
3. 知识蒸馏
简单来说,知识蒸馏就是用一个效果比较好的teacher model教student model。可以使student model提升效果的同时不改变结构。在Amazon这篇论文里提到了这个方法,使用ResNet-152作为teacher model,而ResNet-50作student model。
4. Mixup数据增强
与常规操作不同,数据增强是从数据层面解决过拟合,提高泛化性常见的数据增强方法有:随机裁切、上下左右翻转、颜色抖动、加噪声、图像各种位移、仿射变换等等。
![fc6c3a8d3ab441a64245b525105f0339.png](https://i-blog.csdnimg.cn/blog_migrate/9109ba95c74ff0d25352b3bd3df56a63.jpeg)
![99e1b82e17b28758970524b4d62c91a7.png](https://i-blog.csdnimg.cn/blog_migrate/3990ba3eb6e0ce3bdf8a3242369da0a5.jpeg)
而Mixup最早由《mixup:BEYOND EMPIRICAL RISK MINIMIZATION》这篇论文提出。在Mixup训练中每次需要读取2张输入图像,可以用
![473e84de2dd04b0db0efe00c97ee8db4.png](https://i-blog.csdnimg.cn/blog_migrate/22e6eaf2df68c3a7666da168263c0d1b.png)
Amazon WEB这篇论文的作者融合了上面的四个Trick做了实验,实验效果如图所示。label smoothing用的比较少,实际上也有一些小提升。
![3d2c3ba202f8d958af49d04a41723335.png](https://i-blog.csdnimg.cn/blog_migrate/05e21aa9437d77622dee1b71e2052103.jpeg)
四,总结
这些总结的调参方法是比较常用的炼丹技巧,
我们可以将这些技巧放迁移到我们自己的数据集上获得效果提升,属于比较实用的技巧。
但有时不总是有效,还得结合自己实验的情况多尝试不同的组合,
为了文章里更漂亮的fig,时间允许的情况下还是很值得的。
![96202ac55b3e3508fc164204b3990d56.png](https://i-blog.csdnimg.cn/blog_migrate/7b71f7dad6614f1e2df0f7344252f75d.png)