本文共 5702 字,大约阅读时间需要 19 分钟。
如果你有什么问题,希望跟我能够一起交流,除了通过博客交流外,欢迎你加入我的QQ群,一起交流有关于机器学习、深度学习、计算机视觉有关内容。目前我并未确定具体的研究方向,所以现在 处于广泛涉猎阶段,希望我们能够一起沟通。下图是我的群二维码:
接下来我们进入正题。
在YOLO初体验中,应用到了一个后缀名为cfg的文件,在darknet中有一个文件夹,下面有各种各样的cfg文件
这些cfg文件都是YOLO的配置文件,负责YOLO所需数据集的训练工作,接下来,给大家详细讲解一下配置文件。讲解配置文件,我以 yolov2-tiny.cfg 文件为例。该文件具体内容如下:
[net]# Testing# batch=1# subdivisions=1# Training batch=1 subdivisions=1width=480height=480channels=3momentum=0.9decay=0.0005angle=0saturation = 1.5exposure = 1.5hue=.1learning_rate=0.001burn_in=1000max_batches = 500200policy=stepssteps=400000,450000scales=.1,.1[convolutional]batch_normalize=1filters=16size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=32size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=64size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=128size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=256size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=512size=3stride=1pad=1activation=leaky[maxpool]size=2stride=1[convolutional]batch_normalize=1filters=1024size=3stride=1pad=1activation=leaky###########[convolutional]batch_normalize=1size=3stride=1pad=1filters=512activation=leaky[convolutional]size=1stride=1pad=1filters=30activation=linear[region]anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828bias_match=1classes=1coords=4num=5softmax=1jitter=.2rescore=0object_scale=5noobject_scale=1class_scale=1coord_scale=1absolute=1thresh = .6random=1
加注释后文件如下:
[net]# Testing# batch=1# subdivisions=1# Trainingbatch=1 #每batch个样本更新一次参数。每次迭代要进行训练的图片数量 。subdivisions=1 #如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。 #在darknet代码中,会将batch/subdivisions命名为batch。width=416 #Input图像的宽height=416 #input图像的高channels=3 #Input图像的通道数momentum=0.9 #动量decay=0.0005 #权重衰减正则项,防止过拟合angle=0 #通过旋转角度来生成更多训练样本saturation = 1.5 #通过调整饱和度来生成更多训练样本exposure = 1.5 #通过调整曝光量来生成更多训练样本hue=.1 #通过调整色调来生成更多训练样本learning_rate=0.0001 #初始学习率max_batches = 500200 #训练达到max_batches后停止学习policy=steps #调整学习率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOMsteps=400000,450000 #根据batch_num调整学习率scales=10,.1,.1 #学习率变化的比例,累计相乘[convolutional]batch_normalize=1 #是否做BNfilters=16 #输出多少个特征图size=3 #卷积核的尺寸stride=1 #做卷积运算的步长pad=1 #如果pad为0,padding由 padding参数指定。如果pad为1,padding大小为size/2activation=leaky #激活函数: #logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair[maxpool]size=2 #池化层尺寸stride=2 #池化步进[convolutional]batch_normalize=1filters=32size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=64size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=128size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=256size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=512size=3stride=1pad=1activation=leaky[maxpool]size=2stride=1[convolutional]batch_normalize=1filters=1024size=3stride=1pad=1activation=leaky#######[convolutional]batch_normalize=1size=3stride=1pad=1filters=1024activation=leaky[convolutional]batch_normalize=1size=3stride=1pad=1filters=512activation=leaky[convolutional]batch_normalize=1size=3stride=1pad=1filters=512activation=leaky[convolutional]size=1stride=1pad=1filters=125 #region前最后一个卷积层的filters数是特定的,计算公式为filter=(classes + coords + 1)*5) #5的意义是5个坐标,论文中的x,y,w,h,confidence activation=linear[region]anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 #预选框,可以手工挑选, #也可以通过k means 从训练样本中学出bias_match=1classes=20 #网络需要识别的物体种类数coords=4 #每个box的4个坐标x,y,w,hnum=5 #每个grid cell预测几个box,和anchors的数量一致。当想要使用更多anchors时需要调大num,且如果调大num后训练时Obj趋近0的话可以尝试调大object_scalesoftmax=1 #使用softmax做激活函数jitter=.2 #通过抖动增加噪声来抑制过拟合rescore=1 #暂理解为一个开关,非0时通过重打分来调整l.delta(预测值与真实值的差)object_scale=5 #栅格中有物体时,bbox的confidence loss对总loss计算贡献的权重noobject_scale=1 #栅格中没有物体时,bbox的confidence loss对总loss计算贡献的权重class_scale=1 #类别loss对总loss计算贡献的权重 coord_scale=1 #bbox坐标预测loss对总loss计算贡献的权重absolute=1thresh = .6random=0 #random为1时会启用Multi-Scale Training,随机使用不同尺寸的图片进行训练。
可能大家对于Batch还是不太理解,在这里我再着重说一下:
Batch,中文含义为“批”,一个batch由若干条数据构成。batch是进行网络优化的基本单位,网络参数的每一轮优化需要使用一个batch。batch中的样本是被并行处理的。
那就会有人有问题了,既然是并行处理,那我就多设置一点Batch,这样会不会更好呢?
其实对于Batch来说是分两方面的:
一方面,与单个样本相比,一个Batch的数据能更好的模拟数据集的分布,Batch越大,则对输入数据分布模拟的越好,反应在网络训练上,则体现为能让网络训练的方向“更加正确”,从这个方面来说,Batch越大,训练效果越好。
但另一方面,一个batch也只能让网络的参数更新一次,因此网络参数的迭代会较慢。
所以我们得出以下结论:在测试网络的时候,在条件的允许的范围内尽量使用更大的Batch,这样计算效率会更高。
大家有什么其他关于配置文件的问题可以给我留言哦,我们一起沟通交流。