试验成果校验心得
什么时候加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