关于深度学习:一些深度学习调参心得

41次阅读

共计 2239 个字符,预计需要花费 6 分钟才能阅读完成。

试验成果校验心得

什么时候加 augment,什么时候加 multi-scale,学习率怎么设置?

数据加强

集体领会是,验证性阶段过了之后,当你开始跑 ablation study 时,肯定要留神数据的合理性,不要瞎设计,导致工夫利用低效,很多参数都白跑,前面又要重来。

首先是 augment,分两种状况,先做几个小试验,看看提出办法在加和不加 data Augmet 的性能变动如何,而后选取比拟难看的后果。比方我之前本着最初再加所有 trick 一把梭涨点的想法,后面的比照试验无论如何都不难看(有成果,然而涨点的变动状况忽高忽低)。然而退出 augment 数据丰盛起来之后,模型的成果就起来了,尽管 baseline 也提上去了,会比拟考验你的工作是否足够 solid,如果你的 framework 不长于解决不大或者繁多数据,最好还是加上。

多尺度训练

这玩意会稳固涨点,然而为了显示模型成果,而不是趁火打劫,倡议最初加,因为 augment 就足够了,后期全梭上不太好。当然,也能够防止 baseline 刷的过高,导致你的 idea 增量微不足道很难堪。

学习率

这个挺简略,除了和 stoa 愣是拉不开差距的状况,无脑 adam 就够用,0.001,或者 0.0001,加个 step,warmup 就完事。真正 solid 的工作也不咋在乎这个,咋调(当然基本法还是得要的)都能比拟能看(当然那种被刷到顶的数据集也不算,毕竟模型性能拉不开的时候这玩意还是挺玄学的)。

优化器和学习率优化

· 收敛速度来说 adam 更快,能够用于验证调参,然而细调的 sgd 往往更好。

· cyclic learning rate 和 cosine learning rate 学习率设置。参考一个 gradual warmup+cosine: 地址。

· bs 扩充 k 倍,lr 也要对应扩充 k 倍。

· lr 抉择:lr 的抉择还是看成果,先用突变 lr,找到渐变晋升的点,这个 lr 是适合的,而后以此为基准设置变动学习率学习。

原则上,只有 loss 没有 bug,基本上 loss 越低成果是越好的,所以要尽可能采纳 loss 可能无效降落的学习率,防止过分震荡。(部分极小是个例外,能够思考重启的 SGD 等,然而个别 cosine lr 够了)准则:cos lr 用于寻优和偷懒的最佳成果搜寻;日常训练调参还是间接分阶固定学习率。

☉ 损失函数优化

· 应用 exp、atan 等函数能够将优化空间变得平滑且广域,收敛更好更快。

· 留神均衡不同 item 之间和 item 内的尺度,如 wh 和和 dxdy 预测的数值规模不统一(用 liou 来补救)、cls 存在类别不均衡等。

⊙ batch size

应用较大的 bs 能够更好地预计出最优的优化方向防止陷入部分极小,然而小的 bs 有时候会更准;累计梯度能够使得单卡也具备较大 bs,然而 bn 预计会不准。留神的是,算法验证过拟合时,accumulate*bs 不应该大于总样本数!否则收敛很慢。过拟合验证阶段间接应用 bs= 1 收敛更快,然而大点的 bs 会更收敛平缓。极其状况:当模型收敛的比拟安稳后,设置 bs= 1 来缓缓进一步优化性能。

速度优化

apex 混合精度训练。十分好用,几行代码就完事,速度晋升几倍,精度稍有升高。

教程装置办法:

1. 不可间接 pip install,因为有重名的。2. 不可间接 setup install,那样只会编译 python 的,减速成果不佳):git clone https://github.com/NVIDIA/apexcd apexpip install -v –no-cache-dir –global-option=”–cpp_ext” –global-option=”–cuda_ext” ./## 如果下面第三行编译失败,能够先导一下环境变量,再执行 3export CUDA_HOME=/usr/local/cuda-10.0##。

如果还是红字报错退出,能够退回到一个比较稳定的 commit 版本:1. 进入 clone 的 apex 目录下。2. 创立过来 commit 分支:git checkout -b f3a960f80244cf9e80558ab30f7f7e8cbf03c0a03. 持续方才的步骤 3 装置即可 4. 一堆 warning 不必管,看到 Successfully installed apex-0.1 的字样即可。

注意事项:

· 1080Ti 以上可减速,以下不行

· 依据理论场景测试,如果没有提速或者不显著能够不必

· 查看是否应用半精度的办法:dtype 办法,如: if a.dtype == torch.float16: xxx

· inference 可能呈现模型的 torch.float16 和 target 的 torch.float32 计算不兼容问题,应用 half() 办法转换 gt 为半精度,如 a =a.half()

⊙ 验证和测试

测试集上检测能够查看模型的性能如何,针对成果进行改良;训练集上进行检测能够看是算法否无效、有无 bug(如 recall 低,导致即便过拟合仍然有漏检)。

⊙ 数据加强

加强 + 多尺度训练。能够辅助利用 imgaug,应用办法见笔记。

⊙ 心得

单阶段指定学习(iou 等筛选后)的 anchor 要保障适当多一点,不能像两阶段最终只有多数去回归,这样能更快收敛。(然而 yolo 只回归一个,所以很难学习)

实质:扭转训练时正负样本的散布,缓解极其的样本不均衡问题(参考 GHM 论文的解释)。所以这种做法并不是惟一,能够通过 loss 的优化达到应用大量 anchor 也能学好。

文章起源:https://zhuanlan.zhihu.com/p/163256723

正文完
 0