源码地址:https://github.com/pjreddie/darknet <https://github.com/pjreddie/darknet>
训练指导:https://pjreddie.com/darknet/yolo/ <https://pjreddie.com/darknet/yolo/>

*
训练设备:Lenovo 拯救者;
GPU:1070ti;
显存:8GB;

*
训练数据:VOC 2007 ;VOC 2012。
数据来源及处理方式:https://pjreddie.com/darknet/yolo/
<https://pjreddie.com/darknet/yolo/>

*
第一次训练:采用默认参数,以预训练好的darknet53.conv.74.1为预加载权重开始训练;显存,卒;报错:out of memory;

*
第二次训练:更改参数,将batch降低一些试试,从64改成了48,当天运行平稳,于是去办了点事儿,两天回来后;显存,卒;报错:out of
memory;提示已经训练了2w来个batch;

*
第三次训练:
先看看了参数到底什么含义(batch,subdivision),具体详见:
https://blog.csdn.net/hrsstudy/article/details/65447947?utm_source=itdadao&utm_medium=referral

<https://blog.csdn.net/hrsstudy/article/details/65447947?utm_source=itdadao&utm_medium=referral>

于是增大了subdivision,这样每次载入显存的图片数减少。并且监控GPU显存使用情况(70%左右的占用率),两天后,又卒。原因不详;可能是多尺度?或者是随机的resizing?引起的?反正没有办法,只好,继续降低batch,或者增大subdivision

*
第四次训练
:再不训练出来点啥,没法交代了,于是bacth用了32,subdivision用了16(没理解错的话应该是等效于每次载入两张图片);这次,显存没崩。训练用时大约3天,周三中午1:00左右首次训练完成。但是,发现有问题,当我用训练好的参数去预测单张图片,发现物体框画的很不错,但是label标签不对,比如person会标成bird,原因不详,多测试了几张发现,标签有规律的错乱。所有person都会标成bird,于是猜测label生成或者index什么地方有错误。然后使用valid命令生成验证结果,验证结果存在result文件夹里,全部都是txt文件,按照20个类别,每个类别生成一个txt,对照发现,txt生成的label标签没问题。不太懂为什么(回头翻源码看吧)。

*
第五次训练
:在第四次训练的过程中,旁边新机器装了ubuntu和cuda,两台机器同时开始训练。尝试调大了batch,batch设置为60(约等于默认选项64),subdivision=20;其他参数未变(尚不知道影响方向)。目前正在训练中,肉眼可推断,其收敛速度快于第四次训练,原因可能主要是batch比较大的原因。其梯度下降方向更加明确。

测试MAP指标

* 摸索中,参考的方法有:
最终采用官方测试版本:https://zhuanlan.zhihu.com/p/31852482
<https://zhuanlan.zhihu.com/p/31852482>(目前在装matlib
第四次训练结果如下:

* aeroplane:AP=0.750
* bicycle:AP=0.778
* bird:AP=0.607
* boat:AP=0.577
* bottle:AP=0.544
* bus:AP=0.775
* car:AP=0.844
* cat:AP=0.738
* chair:AP=0.532
* cow:AP=0.660
* dining tables:AP=0.683
* dog:AP=0.704
* horse:AP=0.794
* motorbike:AP=0.772
* person:AP=0.798
* potted plant:AP=0.443
* sheep:AP=0.637
* sofa:AP=0.692
* train:AP=0.776
* tvmonitor:AP=0.686
总迭代次数大于60000次。loss中期下降的比较慢,到45000次左右才相对上比较显著的下降。
* 总结:batch比较小;收敛速度变慢。
第五次训练结果

* aeroplane:AP=0.855
* bicycle:AP=0.855
* bird:AP=0.756
* boat:AP=0.700
* bottle:AP=0.665
* bus:AP=0.876
* car:AP=0.877
* cat:AP=0.894
* chair:AP=0.643
* cow:AP=0.835
* dining tables:AP=0.736
* dog:AP=0.859
* horse:AP=0.869
* motorbike:AP=0.862
* person:AP=0.833
* potted plant:AP=0.562
* sheep:AP=0.753
* sofa:AP=0.780
* train:AP=0.864
* tvmonitor:AP=0.778
平均ap值:0.7926


对比之下,明显发现AP值高很多,而且整体都高很多,原因有两方面,一方面是batch的值由32改成60(接近与默认初始值),另一方面是batch增大后,max_batches
= 50200不变,所以总的迭代次次数增大将近一倍。
另外就是本次训练loss下降的非常好看,平滑并且持续稳定的下降,直到batch大于45000才无明显变化迹象。

总体来说,基本是按照默认参数训练的效果好很多,(batch改成60,是为了subdivision改成20,能够被3整除)。第六次训练更改了学习率和学习率衰减方式。看一看效果。
第六次训练
在第五次训练的基础上调整了学习率,和学习率变化。
具体参数如下:
- learning_rate=0.0015
- policy=steps
- steps=3000,25000,42000

效果上可以说是非常差了,分析原因可能是在3000个batch的时候就将学习率调整为0.00075,太小的学习率使网络无法收敛。(25000次之后损失几乎无明显下降)。
结果就不附了。总之就是很差了。
第七次训练
在第五次训练的基础上,去掉了darknet53后面层的bacth
normalization层,一方面是,想看一下去掉部分BN层的效果,另外一方面,处于对BN层的不完全理解下,感觉在最后分类的时候,如果对input不进行归一化(BN做的事情),会不会加大可分离性(参数的间距无BN的约束后,有肯能会更加离散,当然也有可能会方差更小)。
结果最后的AP值为0.794,非常轻微的优于第五次的结果,感觉更像没什么区别。