深度学习中训练技巧trick合集

深度学习中的各种训练技巧

  本文对深度学习中的一些训练技巧进行了总结,希望对大家的炼丹有所帮助。文章参考了Bag of Tricks for Image Classification with Convolutional Neural Networks和Accurate, Large Minibatch SGD:
Training ImageNet in 1 Hour两篇文章。

训练数据处理

  1. 随机从图片中进行裁剪,得到长方形宽高的子图片,宽高比为[3/4,4/3],再resize到224-224的正方形大小。

  2. 以0.5的概率进行随机水平翻转,在某些场合下(上下翻转不改变语义)也可以上下翻转。

  3. 对亮度对比度饱和度进行调整,随机范围为[0.6,1.4],可根据不同数据集情况进行微调。
  需要注意的是,在验证时不需要对验证集进行上述处理。

  4. 减去均值除以方差进行归一化,均值和方差常采用ImageNet的[123.68,116.779,103.939],[58.393,57.12,57.375]。

网络初始化

  对于ReLU和BN的网络常常采用Xavier的初始化方式,当然Kaiming初始化也是值得尝试的方案。对于BN层 γ \gamma γ初始化为1, β \beta β初始化为0。

训练

  经验表明,使用很大的batch size常常会降低模型的准确度,但有时我们又希望能使用较大的batch size,因此需要一些技巧。
  1. 对学习率进行线性放大,也就是说当小batch size时,我们的学习率为 α \alpha α,我们将batch size增大k倍后,学习率也要相应增大k倍。

  2. 训练初始时要warm up。由于最开始网络的参数是随机分配的,如果开始就使用一个较大的学习率很容易使训练过程不稳定,特别是当使用带动量的优化方法,如Adam等时。一种合适的做法是从一个很小的学习率开始,慢慢将学习率变大到我们希望设定的学习率。这样能够使网络的训练过程更稳定,结果常常也更好。

  3. 学习率衰减,常采用的方法是k个epoch之后将学习率减半或者变为原来的0.1。或者也可以采用类似余弦退火的方法进行衰减。Adam这样自适应学习率的优化器同样也可以使用学习率衰减。

  4. 对参数进行正则化,减轻模型对训练数据的过拟合。

模型的设计

  1. 尽量多使用小卷积核的堆叠来获得大的感受野,当然在分割等任务中可能部分采用空洞卷积。

  2. 使用残差连接或是Concat来帮助训练,也能整合不同尺度的特征。

你可能感兴趣的:(深度学习)