zoukankan      html  css  js  c++  java
  • 深度学习踩坑

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

    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

  • 相关阅读:
    水题大战Vol.3 B. DP搬运工2
    火题小战 C. 情侣?给我烧了!
    火题小战 B. barbeque
    火题小战 A.玩个球
    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表
    NOI2020D1T1美食家
    Java 的随机数
    MySQL 配置文件的配置
    NOIP2020准(ge)备(zi)日记
    android开发EditText禁止输入中文密码的解决方法
  • 原文地址:https://www.cnblogs.com/tofengz/p/13412607.html
Copyright © 2011-2022 走看看