深度学习踩坑

虽然我觉得调参很蛋疼,但是最好还是记录一下,以后可以节省很多时间。
附一个大神的经验总结训练神经网络的秘诀

1 更大的batch size

batch size更大时,学习率可以更大,因而训练更快。
训练网络时,如果batch size很小,比如1或2,这时候采用较大的学习率训练会出现loss波动大,且很有可能几个batch之后loss变成nan,无法训练。
显然解决方法是减小学习率,或者增大batch size,推荐后者,又快又好。
而一般来说无法采用较大的batch size的原因往往是单卡的显存限制,batch size稍微大一点就出现 Out of memory 的报错,因而需要“开源节流”。

  • 如果GPU充足,就采用多卡并行训练,如Pytorch的DataParallel等。假如你原来1张卡只能运行batch size=2,那2张卡就可运行batch size=4,以此类推。卡越多越快乐。
  • 如果你没有那么多卡,就要想办法减小显存占用:
    - 使用Apex混合精度训练;
    - 减小训练输入的图片尺寸,进而就会减小卷积网络中间层的feature map大小,但对一些任务会损失性能;

2 更大的图像输入尺寸

一些密集预测型(dense prediction)的任务,如语义分割、深度/高度估计、人群密度估计等,对细节的要求较高,所以最好在训练网络时保持较大的输入分辨率。

3 过拟合训练

选用一个batch的数据或者少量数据进行过拟合训练,注意:

  • 取消所有数据增强操作
  • 采用model.eval()会固定BN层的统计量(mean,var)和参数(weight,bias),可能导致测试结果差于训练结果。

4 数据规范化

数据规范化(归一化)处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲,数值见的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。如将工资收入属性值映射到[-1, 1]或者[0, 1]内。

(1)最小-最大规范化

最小-最大规范化也称为离散标准化,是对原始数据的线性变换,将数据值映射到[0, 1]之间。
(x^* = frac{x-min}{max-min})
离差标准化保留了原来数据中存在的关系,是消除量纲和数据取值范围影响的最简单方法。这种处理方法的缺点是若数值集中且某个数值很大,则规范化后各值接近于0,并且将会相差不大。(如 1, 1.2, 1.3, 1.4, 1.5, 1.6,8.4)这组数据。若将来遇到超过目前属性[min, max]取值范围的时候,会引起系统报错,需要重新确定min和max。

(2)零-均值规范化(z-score标准化)

零-均值规范化也称标准差标准化,经过处理的数据的均值为0,标准差为1。
(x^* = frac{x-ar{x}}{sigma})
其中(ar{x})为原始数据的均值,(sigma)为原始数据的标准差,是当前用得最多的数据标准化方式。标准差分数可以回答这样一个问题:"给定数据距离其均值多少个标准差"的问题,在均值之上的数据会得到一个正的标准化分数,反之会得到一个负的标准化分数。

(3)小数定标规范化

通过移动属性值的小数位数,将属性值映射到[-1, 1]之间,移动的小数位数取决于属性值绝对值的最大值。
(x^* = frac{x}{10^k})

Ref.

https://blog.csdn.net/weixin_38706928/article/details/80329563

原文地址:https://www.cnblogs.com/tofengz/p/13412607.html