yolov3-voc.cfg 参数超详细说明

714 阅读9分钟
[net]                   #   [xxx]开始的行表示网络的一层,其后的内容为该层的参数配置,[net]为特殊的层,配置整个网络
# Testing               #   测试模式,batch 和 subdivisions 一般都为1
batch=1                 
subdivisions=1

# Training              #   训练模式,batch 和 subdivisions 需要自己选取。
# batch=64              #   batch 为每一次迭代送到网络的图片数量,也叫批数量。
                        #   增大 batch 可以让网络在较少的迭代次数内完成一个 epoch。
                        #   1个 epoch 就是使用训练集中的全部样本训练一次。
                        #   在固定最大迭代次数的前提下,增加 batch 会延长训练时间,但会更好的寻找到梯度下降的方向。
                        #   显存允许的情况下,可以适当增大 batch 来提高内存利用率和训练效果,通常 batch 越大越好。
                        #   这个值是需要大家不断尝试选取的,过小的话会让训练不够收敛,过大会陷入局部最优。
                                     
# subdivisions=16       #   表示将一个 batch 的图片分 subdivisions 份放进网络里,
                        #   一份一份的跑完后,再一起打包算作完成一次 iteration。
                        #   1个 iteration 就是使用 batch 个样本训练一次。
                        #   注意 batch 要是 subdivisions 的整数倍
                        #   subdivisions 越大,可以减轻 CPU/GPU 的压力。
                        #   (分组数目越多,每组样本数量则会更少,显卡压力也会相应减少)
----------------------------------------------------------------------------------------------------------------
width=416               #   输入图像的宽
height=416              #   输入图像的高
                        #   如显存允许,width 和 height 的值越大,对于小目标的识别效果越好。
                        #   width 和 height 影响网络对输入图像的分辨率,从而影响precision,只可以设置成32的倍数,
                        #   因下采样参数是32,故不同尺寸的图像也选择为 32 的倍数(320352608),最小320,最大608#   width 和 height 可以不相等。

channels=3              #   输入图像的通道数,3为RGB彩色图片,1为灰度图,4为RGBA图,A通道表示透明度
----------------------------------------------------------------------------------------------------------------                        
momentum=0.9            #   DeepLearning1中最优化方法中的动量参数,这个值影响着梯度下降到最优值得速度
                        #   注:SGD方法的一个缺点是其更新方向完全依赖于当前 batch 计算出的梯度,因而十分不稳定。
                        #   momentum 算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,
                        #   即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。
                        #   这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。

decay=0.0005            #   权重衰减正则项,防止过拟合。大的权值会使得系统出现overfitting,降低其泛化性能。
                        #   因此,为了避免出现 overfitting,会给误差函数添加一个惩罚项,
                        #   常用的惩罚项是所有权重的平方乘以一个衰减常量之和。用来惩罚大的权值。
                        #   权值衰减惩罚项使得权值收敛到较小的绝对值,从而惩罚大的权值。
                        #   decay参数越大对过拟合的抑制能力越强
----------------------------------------------------------------------------------------------------------------
angle=0                 #   数据增强参数,通过随机旋转[-angle,angle]度来生成更多训练样本 
saturation = 1.5        #   数据增强参数,通过调整饱和度来生成更多训练样本
exposure = 1.5          #   数据增强参数,通过调整曝光度来生成更多训练样本
hue=.1                  #   数据增强参数,通过调整色调来生成更多训练样本
                        #   每次迭代中,会基于角度、饱和度、曝光度、色调产生新的训练样本,可以防止过拟合。
----------------------------------------------------------------------------------------------------------------
learning_rate=0.001     #   学习率,决定着权值更新的速度,设置得太大会使结果超过最优值,太小会使下降速度过慢。
                        #   学习率决定了参数移动到最优值的速度快慢,如果学习率过大,
                        #   很可能会越过最优值导致函数无法收敛,甚至发散;反之,如果学习率过小,优化的效率可能过低,
                        #   算法长时间无法收敛,也易使算法陷入局部最优(非凸函数不能保证达到全局最优)。

                        #   合适的学习率应该是在保证收敛的前提下,能尽快收敛。
                        #   设置较好的learning rate,需要不断尝试。在一开始的时候,可以将其设大一点,
                        #   这样可以使weights快一点发生改变,在迭代一定的epochs之后人工减小学习率,
                        #   一般根据训练轮数设置动态变化的学习率。在yolo训练中,网络训练160epoches,
                        #   初始学习率为0.001,在6090epochs时将学习率除以10。
                        #   接近训练结束:学习速率的衰减应该在100倍以上。
                        
                        #   学习率调整不要太死,实际训练过程中根据loss的变化和其他指标动态调整,手动ctrl+c结束此次训练后,
                        #   修改学习率,再加载刚才保存的模型继续训练即可完成手动调参,调整的依据是根据训练日志来,
                        #   如果loss波动太大,说明学习率过大,适当减小,变为1/51/10均可,如果loss几乎不变,
                        #   可能网络已经收敛或者陷入了局部极小,此时可以适当增大学习率,注意每次调整学习率后一定要训练久一点,
                        #   充分观察,调参是个细活,多次实践体会,慢慢琢磨。
                        #   实际学习率与GPU的个数有关,例如你的学习率设置为0.001,如果你有4块GPU,那真实学习率为0.001/4。

burn_in=1000            #   在迭代次数小于burn_in时,其学习率的更新有一种方式,大于burn_in时,采用policy的更新方式
                        #***这里之前的更新方式不知道什么*****************************************

max_batches = 50200     #   训练次数达到max_batches后停止学习,一次为跑完一个batch
policy=steps            #   学习率调整的策略:constant, steps, exp, poly, step, sig, RANDOM,constant等方式
steps=40000,45000     
scales=.1,.1            #   steps和scale是设置学习率的变化,比如迭代到40000次时,学习率衰减10倍,
                        #   45000次迭代时,学习率又会在前一个学习率的基础上衰减10倍。
----------------------------------------------------------------------------------------------------------------
[convolutional]         #   一层卷积层的配置说明,直到下一个[XXX],都是该层的配置
batch_normalize=1       #   是否进行BN处理,关于BN,https://www.cnblogs.com/eilearn/p/9780696.html
filters=32              #   卷积核个数,也是输出通道数,输出特征图数量
size=3                  #   卷积核尺寸,这里是3*3
stride=1                #   卷积步长
pad=1                   #   如果 pad 为0,padding由 padding 参数指定。
                        #   如果 pad 为1,padding大小为size/2向下取整,如3/2=1。

activation=leaky        #   网络层激活函数,常见激活函数如下:
                        #   logistic,loggy,relu,elu,relie,plse,
                        #   hardtan,lhtan,linear,ramp,leaky,tanh,stair
       
[convolutional]
batch_normalize=1
filters=64
size=3
stride=2
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=32
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
----------------------------------------------------------------------------------------------------------------
[shortcut]              #   shotcut 层配置说明
                        #   shortcut 部分是卷积的跨层连接,就像 Resnet 中使用的一样,
                        #	本层的输入与输出一般保持一致,并且不进行其他操作,只是求差。
from=-3                 #   参数 from 是 −3,意思是 shortcut 层前面倒数第3层网络的输出作为本层的输入。

activation=linear       #   层次激活函数
                        #   关于 shortcut,https://cloud.tencent.com/developer/article/1148375
----------------------------------------------------------------------------------------------------------------
......                  #   这里还有若干层,参数一样,不赘述
......
......
----------------------------------------------------------------------------------------------------------------
[convolutional]         #   YOLO层前面一层卷积层配置说明
size=1
stride=1
pad=1
filters=75              #   这一层的filters需要根据公式设置
                        #   filters = (classes + 5) * anchors_num
                        #   classes 为类别数,与下面yolo层的classes一致,
                        #   5 的意义是4个坐标加一个置信率,论文中的tx,ty,tw,th,to
                        #   anchors_num 表示YOLO中每个cell预测框的个数,YOLOV3中为3
                        #   此处 filters = (20 + 5) * 3 = 75
                        
activation=linear
----------------------------------------------------------------------------------------------------------------
[yolo]                  #   [yolo/region]层配置说明,在yoloV2中yolo层叫region层
mask = 6,7,8            #   使用 anchor 的索引,从0开始,6,7,8表示使用下面定义的anchors中的最后三个 anchor
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326   #   预测框的初始宽高,
                                                                                        #   第一个是w,第二个是h
classes=20              #   类别数目
num=9                   #   每个grid cell总共预测几个box,和anchors的数量一致。当想要使用更多anchors时需要调大num
jitter=.3               #   利用抖动产生更多训练样本,YOLOv2中使用的是crop,filp,以及net层的angle

ignore_thresh = .5      #   ignore_thresh 指得是参与计算的IOU的阈值大小。
                        #   当IOU大于ignore_thresh,不会参与loss的计算,否则,检测框将会参与损失计算。
                        #   关于 IOU,https://www.cnblogs.com/darkknightzh/p/9043395.html

                        #   参数目的和理解:目的是控制参与loss计算的检测框的规模,当ignore_thresh过大,
                        #   接近于1的时候,那么参与检测框回归loss的个数就会比较少,同时也容易造成过拟合;
                        #   而如果ignore_thresh设置的过小,那么参与计算的检测框回归loss数量规模就会很大。
                        #   同时也容易在进行检测框回归的时候造成欠拟合。

                        #   参数设置:一般选取0.5-0.7之间的一个值

truth_thresh = 1        
random=1                #   为1打开随机多尺度训练,为 0 则关闭

                        #   提示:当打开随机多尺度训练时,前面设置的网络输入尺寸width和height其实就不起作用了,
                        #   width会在320到608之间随机取值,且width=height,
                        #   每10轮随机改变一次,可以根据自己需要修改随机尺度训练的范围,这样可以增大batch
----------------------------------------------------------------------------------------------------------------
[route]                 #   看到有人讲这一层是融合层,就是把层进行合并,然后输出到下一层
layers = -4             #   将本层前面倒数第4层的输出作为本层的输出
			#   如果layers = -1, 61 则表示将本层的上一层与整个网络的第61层的输出相作为本层输出
			#   相加规则为:如上一层的输出为52 x 52 x 128,第61层的输出为52 x 52 x 256
			#   则本层输出为52 x 52 x (128+256),所以route的两层的 weight 和 height 必须相等
			#   若不相等,则本层输出为 0 x 0 x 0,下一层得不到有效输入,
			#   就会报 Layer before convolutional must output image. 然后停止
**********************************************************


[upsample]              #   上采样层
stride=2                #   卷积步长

# 参考:
# https://www.cnblogs.com/hls91/p/10911997.html
# https://blog.csdn.net/qq_35872456/article/details/84216129
# https://blog.csdn.net/phinoo/article/details/83022101