作者:李波2602884584 | 来源:互联网 | 2023-09-14 12:29
论文地址,https://arxiv.org/abs/1810.08425v3关于论文,可以看看https://zhuanlan.zhihu.com/p/59498319
论文地址,https://arxiv.org/abs/1810.08425v3
关于论文,可以看看https://zhuanlan.zhihu.com/p/59498319
该篇论文主要做两件事:
1、检测的backbone网络不再使用预训练模型
2、修改backbone为Root-ResNet
本文主要在darknet框架试验下Root-ResNet-18,未在公共数据集上验证,直接用在自己的数据集上,另外记录下不用预训练模型,从0训练的技巧,主要使用Gradual warmup。
1、修改Root-ResNet-18部分
backbone网络部分,作者认为检测和分类任务不同,一开始用7*7conv和max pooling,虽然可以减少计算量,但是在检测中意味着信息丢失。因此backbone部分相当于增加了计算量,但是在检测部分,32倍下采样之后减少通道数来减少一部分计算量,主要做了以下修改:
(a)去掉max pooling
(b)第一个conv层 stride由2改为1
(c)取代7*7conv为3个3*3conv
(d)检测部分通道数修改为128
(e)backbone网络和检测部分均使用BN层,使用大学习率,论文中为0.05,从0训练模型。
在darknet上修改的Root-ResNet18.cfg,其中anchor为自己的数据集anchor
[net]
# Testing
# batch=1
# subdivisiOns=1
# Training
batch=64
subdivisiOns=16
" class="has" src="https://img.php1.cn/3cd4a/1eebe/cd5/ddcc574beb16294e.jpeg" />
从0训练的大前提是BN层,使用大学习率快速收敛。
在darknet中一开始使用0.05学习率,很快会出现loss NAN,需要做gradual wramup策略。
例如先采用0.0005学习率,迭代5个epoch,设置迭代次数n,且n*64=5*数据量,
例如4张卡学习率设置:
learning_rate=0.000125
burn_in=4000
迭代完后extract weights,
./darknet partial cfg/Root-Resnet.cfg Root-Resnet_final.weights warmup1.conv.50 50
在warmup1.conv.50模型上,将学习率*10,采用0.005学习率,再做一次warmup
learning_rate=0.00125
burn_in=4000
迭代完再做extract weights,获得warmup2.conv.50
最后在warmup2.conv.50上用大学习率0.05,设置好step,多训练几个epoch,
learning_rate=0.0125
burn_in=4000
最终迭代完,可以得到不差于使用预训练模型训练数据的效果。