一、配置文件yolo.cfg
[net] # Testing #測試模式 batch=1 subdivisions=1 # Training #訓練模式 每次前向圖片的數目=batch/subdivisions # batch=64 # subdivisions=16 #關於batch與subdivision:在訓練輸出中,訓練迭代包括8組,這些batch樣本又被平均分成subdivision=8次送入網絡參與訓練,以減輕內存占用的壓力;batch越大,訓練效果越好,subdivision越大,占用內存壓力越小 width=416 height=416 channels=3 #網絡輸入的寬、高、通道數這三個參數中,要求width==height, 並且為32的倍數,大分辨率可以檢測到更加細小的物體,從而影響precision momentum=0.9 #動量,影響梯度下降到最優的速度,一般默認0.9 decay=0.0005 #權重衰減正則系數,防止過擬合 angle=0 #旋轉角度,從而生成更多訓練樣本 saturation = 1.5 #調整飽和度,從而生成更多訓練樣本 exposure = 1.5 #調整曝光度,從而生成更多訓練樣本 hue=.1 #調整色調,從而生成更多訓練樣本 learning_rate=0.001 #學習率決定了權值更新的速度,學習率大,更新的就快,但太快容易越過最優值,而學習率太小又更新的慢,效率低,一般學習率隨着訓練的進行不斷更改,先高一點,然后慢慢降低,一般在0.01--0.001 burn_in=1000 #學習率控制的參數,在迭代次數小於burn_in時,其學習率的更新有一種方式,大於burn_in時,才采用policy的更新方式 max_batches = 50200 #迭代次數,1000次以內,每訓練100次保存一次權重,1000次以上,每訓練10000次保存一次權重 policy=steps # 學習率策略,學習率下降的方式 steps=40000,45000 #學習率變動步長 scales=.1,.1 #學習率變動因子:如迭代到40000次時,學習率衰減十倍,45000次迭代時,學習率又會在前一個學習率的基礎上衰減十倍 [convolutional] batch_normalize=1 #BN filters=32 #卷積核數目 size=3 #卷積核尺寸 stride=1 #做卷積運算的步長 pad=1 #如果pad為0,padding由 padding參數指定;如果pad為1,padding大小為size/2,padding應該是對輸入圖像左邊緣拓展的像素數量 activation=leaky #激活函數類型 [yolo] mask = 6,7,8 #使用anchor時使用前三個尺寸 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 #anchors是可以事先通過cmd指令計算出來的,是和圖片數量,width,height以及cluster(就是下面的num的值,即想要使用的anchors的數量)相關的預選框,可以手工挑選,也可以通過k-means算法從訓練樣本中學出 classes=20 num=9 #每個grid cell預測幾個box,和anchors的數量一致。當想要使用更多anchors時需要調大num,且如果調大num后訓練時Obj趨近0的話可以嘗試調大object_scale jitter=.3 #通過抖動來防止過擬合,jitter就是crop的參數 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 random=1 #如果顯存小,設置為0,關閉多尺度訓練,random設置成1,可以增加檢測精度precision,每次迭代圖片大小隨機從320到608,步長為32,如果為0,每次訓練大小與輸入大小一致
batch:每次迭代要進行訓練的圖片數量
subdivision:batch中的圖片再產生子集,源碼中的圖片數量int imgs = net.batch * net.subdivisions * ngpus
也就是說每輪迭代會從所有訓練集里隨機抽取 batch = 64 個樣本參與訓練,每個batch又會被分成 64/16 = 4 次送入網絡參與訓練,以減輕內存占用的壓力,也就是每次 subdivision = 16 送入網絡
width:輸入圖片寬度, height:輸入圖片高度,channels :輸入圖片通道數
對於每次迭代訓練,YOLO會基於角度(angle),飽和度(saturation),曝光(exposure),色調(hue)產生新的訓練圖片
angle:圖片角度變化,單位為度,假如 angle=5,就是生成新圖片的時候隨機旋轉-5~5度
weight decay:權值衰減
防止過擬合,當網絡逐漸過擬合時網絡權值往往會變大,因此,為了避免過擬合,在每次迭代過程中以某個小因子降低每個權值,也等效於給誤差函數添加一個懲罰項,常用的懲罰項是所有權重的平方乘以一個衰減常量之和。權值衰減懲罰項使得權值收斂到較小的絕對值。
angle:圖片角度變化,單位為度,假如 angle=5,就是生成新圖片的時候隨機旋轉-5~5度
saturation & exposure: 飽和度與曝光變化大小,tiny-yolo-voc.cfg中1到1.5倍,以及1/1.5~1倍
hue:色調變化范圍,tiny-yolo-voc.cfg中-0.1~0.1
max_batches:最大迭代次數
learning rate:學習率
學習率決定了參數移動到最優值的速度快慢,如果學習率過大,很可能會越過最優值導致函數無法收斂,甚至發散;反之,如果學習率過小,優化的效率可能過低,算法長時間無法收斂,也易使算法陷入局部最優(非凸函數不能保證達到全局最優)。合適的學習率應該是在保證收斂的前提下,能盡快收斂。
設置較好的learning rate,需要不斷嘗試。在一開始的時候,可以將其設大一點,這樣可以使weights快一點發生改變,在迭代一定的epochs之后人工減小學習率。
policy:調整學習率的策略
調整學習率的policy,有如下policy:CONSTANT, STEP, EXP, POLY,STEPS, SIG, RANDOM
steps:學習率變化時的迭代次數
根據batch_num調整學習率,若steps=100,20000,30000,則在迭代100次,20000次,30000次時學習率發生變化,該參數與policy中的steps對應
scales:學習率變化的比率
相對於當前學習率的變化比率,累計相乘,與steps中的參數個數保持一致
二、訓練時的參數含義
- 397: 指示當前訓練的迭代次數
- 7.748884: 是總體的Loss(損失)
- 7.593599 avg: 是平均Loss,這個數值應該越低越好,一般來說,一旦這個數值低於0.060730 avg就可以終止訓練了。
- 0.000025 rate: 代表當前的學習率,是在.cfg文件中定義的。
- 5.510836 seconds: 表示當前批次訓練花費的總時間。
- 25408 images: 這一行最后的這個數值是397*64的大小,表示到目前為止,參與訓練的圖片的總量。
- Avg IOU: 0.574694: 表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比,這里是57.46%,這個模型需要進一步的訓練。
- Class: 0.962937: 標注物體分類的正確率,期望該值趨近於1。
- Obj: 0.022145: 越接近1越好。
- No Obj: 0.000459: 期望該值越來越小,但不為零。
- count: 2:count后的值是所有的當前subdivision圖片(本例中一共8張)中包含正樣本的圖片的數量。在輸出log中的其他行中,可以看到其他subdivision也有的只含有<16個正樣本,說明在subdivision中含有不含檢測對象的圖片。
參考:
https://blog.csdn.net/la_fe_/article/details/81623869
https://blog.csdn.net/a8039974/article/details/90443950