yolo---参数解释之cfg文件参数

                                                                                             yolo---参数解释之cfg文件参数

**********************cfg文件,总体上,重点参数说明**********************
      batch: 每一次迭代送到网络的图片数量,也叫批数量。增大这个可以让网络在较少的迭代次数内完成一个epoch。在固定最大迭代次数的前提下,增加batch会延长训练时间,但会更好的寻找到梯度下降的方向。如果你显存够大,可以适当增大这个值来提高内存利用率。这个值是需要大家不断尝试选取的,过小的话会让训练不够收敛,过大会陷入局部最优。
      subdivision:这个参数很有意思的,它会让你的每一个batch不是一下子都丢到网络里。而是分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration。这样会降低对显存的占用情况。如果设置这个参数为1的话就是一次性把所有batch的图片都丢到网络里,如果为2的话就是一次丢一半。
      angle:图片旋转角度,这个用来增强训练效果的。从本质上来说,就是通过旋转图片来变相的增加训练样本集。
      saturation,exposure,hue:饱和度,曝光度,色调,这些都是为了增强训练效果用的。
      learning_rate:学习率,训练发散的话可以降低学习率。学习遇到瓶颈,loss不变的话也减低学习率。
      max_batches: 最大迭代次数。
      policy:学习策略,一般都是step这种步进式。
      step,scales:这两个是组合一起的,举个例子:learn_rate: 0.001, step:100,25000,35000   scales: 10, .1, .1 这组数据的意思就是在0-100次iteration期间learning rate为原始0.001,在100-25000次iteration期间learning rate为原始的10倍0.01,在25000-35000次iteration期间learning rate为当前值的0.1倍,就是0.001, 在35000到最大iteration期间使用learning rate为当前值的0.1倍,就是0.0001。随着iteration增加,降低学习率可以是模型更有效的学习,也就是更好的降低train loss。
      最后一层卷积层中filters数值是 5×(类别数 + 5)。
      region里需要把classes改成你的类别数。
      最后一行的random,是一个开关。如果设置为1的话,就是在训练的时候每一batch图片会随便改成320-640(32整倍数)大小的图片。目的和上面的色度,曝光度等一样。如果设置为0的话,所有图片就只修改成默认的大小 416*416。
@https://www.cnblogs.com/qinguoyi/p/8507803.html
**********************cfg文件,细节上,以yolo v3为例,参数细说明**********************
#为注释符号

[net]
# Testing           #测试模式  #初始batch参数要分为两类,分别为训练集和测试集,不同模式相应放开参数
 batch=1    
 subdivisions=1

# Training          #训练模式  每次前向图片的数目=batch/subdivisions
# batch=64          #batch:一批训练样本的样本数量. 每batch个样本更新一次参数
                    #关于batch与subdivision:
                    #在训练输出中,训练迭代包括8组,这些batch样本又被平均分成subdivision=8次送入网络参与训练,以减轻内存占用的压力
# subdivisions=16   #batch越大,训练效果越好,subdivision越大,占用内存压力越小
                    #batch/subdivisions作为一次性送入训练器的样本数量
                    #如果内存不够大,将batch分割为subdivisions个子batch
                    #(subdivisions相当于分组个数,相除结果作为一次送入训练器的样本数量)
                    #注意:上面这两个参数如果电脑内存小,则把batch改小一点,batch越大,训练效果越好
                    #Subdivisions越大,可以减轻显卡压力(分组数目越多,每组样本数量则会更少,显卡压力也会相应减少)



width=416       #网络输入的宽、高、通道数
height=416
channels=3      #这三个参数中,要求width==height, 并且为32的倍数,大分辨率可以检测到更加细小的物体,从而影响precision
                #以上三个参数为输入图像的参数信息 width和height 影响网络对输入图像的分辨率,从而影响precision,只可以设置成32的倍数
                #(为什么是32?由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320352…..608},最小320*320,最大608*608,网络会自动改变尺寸,并继续训练的过程。)


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

decay=0.0005     #权重衰减正则系数,防止过拟合, 正则项往往有重要意义
                 #增加样本的数量,改变基础样本的状态. 增加样本整体的数量,增加样本量减少过拟合

angle=0          #旋转角度,从而生成更多训练样本 
saturation = 1.5 #调整饱和度,从而生成更多训练样本
exposure = 1.5   #调整曝光度,从而生成更多训练样本
hue=.1           #调整色调,从而生成更多训练样本

learning_rate=0.001  #学习率 ,决定了权值更新的速度. 学习率大,更新的就快,但太快容易越过最优值; 而学习率太小又更新的慢,效率低.
                     #一般学习率随着训练的进行不断更改,先高一点,然后慢慢降低,一般在0.01--0.001
                     #学习率决定着权值更新的速度,设置得太大会使结果超过最优值,直接错过最优值,震荡回去,太小会使下降速度过慢,导致收敛过慢。
                     #如果仅靠人为干预调整参数,需要不断修改学习率。刚开始训练时可以将学习率设置的高一点,而一定轮数之后,将其减小。
                     #在训练过程中,一般根据训练轮数设置动态变化的学习率。
                     #[基本训练守则]
                     #刚开始训练时:学习率以 0.01 ~ 0.001 为宜。
                     #一定轮数过后:逐渐减缓。
                     #接近训练结束:学习速率的衰减应该在100倍以上。
                     #提供参考资料学习率的调整参考https://blog.csdn.net/qq_33485434/article/details/80452941
 
burn_in=1000         #学习率控制的参数,在迭代次数小于burn_in时,其学习率的更新有一种方式,大于burn_in时,才采用policy的更新方式
max_batches = 50200  #迭代次数,1000次以内,每训练100次保存一次权重; 1000次以上,每训练10000次保存一次权重; 训练达到max_batches后停止学习
policy=steps         #学习率策略,学习率下降的方式
                     #这个是学习率调整的策略,有policy:constant, steps, exp, poly, step, sig, RANDOM,constant等方式
                     #constant: 保持学习率为常量,caffe里为fixed
                     #steps: 比较好理解,按照steps来改变学习率
steps=40000,45000    #学习率变动步长 #Steps和scales相互一一对应, 这两个参数是设置学习率的变化, 根据batch_num调整学习率
scales=.1,.1         #学习率变动因子
                     #如迭代到40000次时,学习率衰减十倍; 45000次迭代时,学习率又会在前一个学习率的基础上衰减十倍


[convolutional]
batch_normalize=1    #BN,  是否做BN操作
filters=32           #卷积核数目,  输出特征图的数量
size=3               #卷积核尺寸
stride=1             #做卷积运算的步长
pad=1                #如果pad为0,padding由 padding参数指定
             #如果pad为1,padding大小为size/2,padding应该是对输入图像左边缘拓展的像素数量
activation=leaky     #激活函数类型: logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair

# Downsample        #以下为训练网络结构

[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   #借鉴了resnet网络的shortcut方式可以加深网络
                    #输入与输出:输入与输出一般保持一致,并且不进行其他操作,只是求差。
                    #处理操作:res层来源于resnet,为了解决网络的梯度弥散或者梯度爆炸的现象,提出将深层神经网络的逐层训练改为逐阶段训练,
                    #将深层神经网络分为若干个子段,每个小段包含比较浅的网络层数,然后用shortcut的连接方式使得每个小段对于残差进行训练,
                    #每一个小段学习总差(总的损失)的一部分,最终达到总体较小的loss,同时,很好的控制梯度的传播,
                    #避免出现梯度消失或者爆炸等不利于训练的情形。


# Downsample

[convolutional]
batch_normalize=1
filters=128
size=3
stride=2
pad=1
activation=leaky

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

# Downsample

[convolutional]
batch_normalize=1
filters=256
size=3
stride=2
pad=1
activation=leaky

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear


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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

# Downsample

[convolutional]
batch_normalize=1
filters=512
size=3
stride=2
pad=1
activation=leaky

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

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

[shortcut]
from=-3
activation=linear


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

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

[shortcut]
from=-3
activation=linear


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

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

[shortcut]
from=-3
activation=linear


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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear


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

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

[shortcut]
from=-3
activation=linear


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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

# Downsample

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=2
pad=1
activation=leaky

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

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

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

[shortcut]
from=-3
activation=linear

######################

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

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

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

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

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

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

################################ 重点 ##################### 
[convolutional]   # YOLO层前面一层卷积层配置说明
size=1
stride=1
pad=1
filters=75        #每一层前的最后一个卷积层中的 filters=num(yolo层个数)*(classes+5) ,5的意义是5个坐标,论文中的tx,ty,tw,th,to 
                  #每一个[region/yolo]层前的最后一个卷积层中的 filters=num(yolo层个数)*(classes+5), 5的意义是5个坐标,论文中的tx,ty,tw,th,po
                  #filters=num(预测框个数)*(classes+5),5的意义是4个坐标加一个置信率,论文中的tx,ty,tw,th,
                  #自己使用时,此处的值一定要根据自己的数据集进行更改,例如你识别4个类,则:filters=3*(4+5)=27,三个fileters都需要修改,切记
activation=linear


[yolo]            # YOLO层配置说明。在yoloV2中yolo层叫region层,yolo2,3各自叫法不同     
mask = 6,7,8      #训练框
                  #如果mask的值是0,1,2,这意味着使用第一,第二和第三个anchor。 这是有道理的,因为检测层的每个单元预测3个box。 
                  #总共有三个检测层,共计9个anchor。
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326  
                  #1.anchors是可以事先通过cmd指令计算出来的,是和图片数量,width,height以及cluster
                  #(应该就是下面的num的值,即想要使用的anchors的数量)相关的预选框,可以手工挑选,也可以通过k-means算法从训练样本中学出。聚类。
                  #2.预测框的初始宽高,第一个是w,第二个是h,总数量是num*2

classes=20       #类别数目  #ctrl+f搜 yolo, 总共会搜出3个含有yolo的地方。
num=9            #每个grid cell预测几个box,和anchors的数量一致。
                 #当想要使用更多anchors时需要调大num,且如果调大num后训练时Obj趋近0的话可以尝试调大object_scale
                 #每个grid预测的BoundingBox num/yolo层个数
jitter=.3        #通过抖动来防止过拟合,jitter就是crop的参数
                 #利用数据抖动产生更多数据,YOLOv2中使用的是crop,filp,以及net层的angle,flip是随机的,crop就是jitter的参数,
                 #tiny-yolo-voc.cfg中jitter=.2,就是在0~0.2中进行cr
ignore_thresh = .5  
     #ignore_thresh 指得是参与计算的IOU阈值大小。当预测的检测框与ground true的IOU大于ignore_thresh的时候,参与loss的计算,否则,检测框的不参与损失计算。
     #目的是控制参与loss计算的检测框的规模,当ignore_thresh过于大,接近于1的时候,那么参与检测框回归loss的个数就会比较少,同时也容易造成过拟合;
     #而如果ignore_thresh设置的过于小,那么参与计算的会数量规模就会很大。同时也容易在进行检测框回归的时候造成欠拟合。
     #参数设置:一般选取0.5-0.7之间的一个值,之前的计算基础都是小尺度(13*13)用的是0.7,(26*26)用的是0.5。这次先将0.5更改为0.7。 


truth_thresh = 1
     #参与计算的IOU阈值大小.当预测的检测框与ground true的IOU大于ignore_thresh的时候,参与loss的计算,否则,检测框的不参与损失计算。
     #理解:目的是控制参与loss计算的检测框的规模,当ignore_thresh过于大,接近于1的时候,那么参与检测框回归loss的个数就会比较少,同时也容易造成过拟合;而如果ignore_thresh设置的过于小,那么参与计算的会数量规模就会很大。同时也容易在进行检测框回归的时候造成欠拟合。
     #参数设置:一般选取0.5-0.7之间的一个值,之前的计算基础都是小尺度(13*13)用的是0.7,(26*26)用的是0.5。这次先将0.5更改为0.7。
     #参考:https://www.e-learn.cn/content/qita/804953

random=1    #多尺度训练:如果显存小,设置random=0,关闭多尺度训练。
            #random设置成1,可以增加检测精度precision,每次迭代图片大小随机从320到608,步长为32,如果为0,每次训练大小与输入大小一致
            #提示:当打开随机多尺度训练时,前面设置的网络输入尺寸width和height其实就不起作用了,width会在320到608之间随机取值,且width=height,
            #每10轮随机改变一次,一般建议可以根据自己需要修改随机尺度训练的范围,这样可以增大batch,可以自行尝试!


[route]     #路由层    进行多尺度训练
layers = -4 #当属性只有一个值时,它会输出由该值索引的网络层的特征图。 
            #在我们的示例中,它是−4,所以层级将输出路由层之前第四个层的特征图。
            #当图层有两个值时,它会返回由其值所索引的图层的连接特征图。 
            #在我们的例子中,它是−1,61,并且该图层将输出来自上一层(-1)和第61层的特征图,并沿深度的维度连接。

[convolutional]     #一层卷积层的配置说明
batch_normalize=1   #是否进行BN处理,什么是BN此处不赘述,1为是,0为不是 
filters=256         #卷积核个数,也是输出通道数
size=1              #卷积核尺寸
stride=1            #卷积步长
pad=1               #卷积时是否进行0 padding,padding的个数与卷积核尺寸有关,为size/2向下取整,如3/2=1
activation=leaky    #网络层激活函数
                    #size=3 卷积核尺寸3*3配合padding且步长为1时,不改变feature map的大小
                    #size=3 卷积核尺寸为3*3,配合padding且步长为2时,feature map变为原来的一半大小

[upsample]
stride=2

[route]
layers = -1, 61



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

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

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

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

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

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

[convolutional]
size=1
stride=1
pad=1
filters=75
activation=linear

[yolo]          # YOLO层配置说明
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=20
num=9           #每个grid cell预测几个box,和anchors的数量一致。
                #当想要使用更多anchors时需要调大num,且如果调大num后训练时Obj趋近0的话可以尝试调大object_scale

jitter=.3           #利用数据抖动产生更多数据,YOLOv2中使用的是crop,filp,以及net层的angle,
                    #flip是随机的, jitter就是crop的参数,tiny-yolo-voc.cfg中jitter=.3,就是在0~0.3中进行crop
ignore_thresh = .5  #决定是否需要计算IOU误差的参数,大于thresh,IOU误差不会夹在cost function中
truth_thresh = 1
random=1            #多尺度。如果为1,每次迭代图片大小随机从320到608,步长为32,如果为0,每次训练大小与输入大小一致

[route]
layers = -4

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

[upsample]
stride=2

[route]
layers = -1, 36



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

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

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

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

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

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

[convolutional]
size=1
stride=1
pad=1
filters=75
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=20
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
***************************************************************************************
@https://blog.csdn.net/qq_43211132/article/details/88679979
原文地址:https://www.cnblogs.com/carle-09/p/12192206.html