1. 程式人生 > >【YOLO】YOLO網路中引數的解讀

【YOLO】YOLO網路中引數的解讀

1.Batch_Size(批尺寸)
該引數主要用於批梯度下降演算法(Batch Gradient Descent)中,批梯度下降演算法是每次迭代都遍歷批中的所有樣本,由批中的樣本共同決定最優的方向,Batch_Size 正是批中的樣本數量。 

若資料集比較小,可以採用全資料集(Full Batch Learning)的形式,由全資料確定的方向能更好地代表樣本總體,從而更準確地朝向極值所在的方向;但該種方式並不適用於大資料集; 
另一個極端是每次只訓練一個樣本,即Batch_Size=1,每次修正方向以各自樣本的梯度方向修正,橫衝直撞各自為政,難以達到收斂。 
在合理範圍內增大Batch_Size,可以 


(1)提高記憶體利用率,進而提高大矩陣乘法的並行效率; 
(2)跑完一次epoch(全資料集)所需的迭代次數減少,對於相同資料量的處理速度進一步加快; 
(3)在一定範圍內,一般來說Batch_Size越大,其確定的下降方向越準,引起的訓練震盪越小。 
盲目增大Batch_Size的壞處: 
(1)超出記憶體容量; 
(2)跑完一次epoch(全資料集)所需的迭代次數減小,要想達到相同的精度,所需要的epoch數量越多,對引數的修正更加緩慢; 
(3)Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化; 
Batch_Size引數除錯: 
大的Batch_Size在視訊記憶體能允許的情況下收斂速度是比較快的但有時會陷入區域性最小的情況;小Batch_Size引入的隨機性會更大些,有可能會有更好的效果,但是收斂速度會慢一些;當Batch_Size太小,而類別數又比較多的時候,會導致loss函式震盪而不收斂。具體除錯過程中,一般可根據GPU視訊記憶體,設定為最大,而且一般要求是8的倍數,選擇一部分資料,跑幾個Batch看看loss是否在變小,再選擇合適的Batch_Size。 

每Batch_Size個樣本更新一次引數。

2.subdivisions 
如果記憶體不夠大,將batch分割為subdivisions個子batch,每個子batch的大小為batch/subdivisions; 
darknet程式碼中,是將batch/subdivisions命名為batch;

3.衝量-momentum 
梯度下降法中一種常用的加速技術,對於一般的SGD,其表示式為

沿著負梯度方向下降,而帶momentum項的SGD則寫成

其中是momentum係數,通俗的理解上面的式子就是,如果上一次的momentum(即)與這一次的負梯度方向是相同的,那麼這次下降的幅度就會加大,因此可以起到加速收斂的作用,衝量的建議配置為0.9。

4.權值衰減-weight decay 
使用的目的是防止過擬合,當網路逐漸過擬合時網路權值往往會變大,因此,為了避免過擬合,在每次迭代過程中以某個小因子降低每個權值,也等效於給誤差函式新增一個懲罰項,常用的懲罰項是所有權重的平方乘以一個衰減常量之和。權值衰減懲罰項使得權值收斂到較小的絕對值。

5.angle、saturation、exposure、hue 
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  
在每次迭代中,會基於角度、飽和度、曝光、色調產生新的訓練圖片。

6.學習率-learning rate 
學習率決定了引數移動到最優值的速度快慢,如果學習率過大,很可能會越過最優值導致函式無法收斂,甚至發散;反之,如果學習率過小,優化的效率可能過低,演算法長時間無法收斂,也易使演算法陷入區域性最優(非凸函式不能保證達到全域性最優)。合適的學習率應該是在保證收斂的前提下,能儘快收斂。 
設定較好的learning rate,需要不斷嘗試。在一開始的時候,可以將其設大一點,這樣可以使weights快一點發生改變,在迭代一定的epochs之後人工減小學習率。 
在yolo訓練中,網路訓練160epoches,初始學習率為0.001,在60和90epochs時將學習率除以10。

7.burn_in 
與學習率的動態變化有關??? 
if (batch_num < net.burn_in) return net.learning_rate * pow((float)batch_num / net.burn_in, net.power); 
Yolo network.c中出現的程式碼

8.最大迭代次數-max_batches 
權重更新次數

9.調整學習率的策略-policy 
調整學習率的policy,有如下policy:CONSTANT, STEP, EXP, POLY,STEPS, SIG, RANDOM

10.學習率變化時的迭代次數-steps 
根據batch_num調整學習率,若steps=100,25000,35000,則在迭代100次,25000次,35000次時學習率發生變化,該引數與policy中的steps對應;

11.學習率變化的比率-scales 
相對於當前學習率的變化比率,累計相乘,與steps中的引數個數保持一致;

12.是否做BN-batch_normalize

13.啟用函式-activation 
包括logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair

14.[route] layer 
the route layer is to bring finer grained features in from earlier in the network 
15.[reorg] layer 
the reorg layer is to make these features match the feature map size at the later layer;The end feature map is 13x13, the feature map from earlier is 26x26x512. The reorg layer maps the 26x26x512 feature map onto a 13x13x2048 feature map so that it can be concate_nated with the feature maps at 13x13 resolution.

16.anchors 
anchors:預測框的初始寬高,第一個是w,第二個是h,總數量是num*2,YOLOv2作者說anchors是使用K-MEANS獲得,其實就是計算出哪種型別的框比較多,可以增加收斂速度,如果不設定anchors,預設是0.5;

17.jitter 
通過抖動增加噪聲來抑制過擬合

18.rescore 
可理解為一個開關,非0時通過重打分來調整l.delta(預測值與真實值的差)

19.random(yolo模型訓練) 
random為1時會啟用Multi-Scale Training,隨機使用不同尺寸的圖片進行訓練,如果為0,每次訓練大小與輸入大小一致; 
是否隨機確定最後的預測框

幾個尺寸說明

(1)batch_size:批大小。在深度學習中,一般採用SGD訓練,即每次訓練在訓練集中取batch_size個樣本訓練; 
(2)iteration:1個iteration等於使用batchsize個樣本訓練一次; 
(3)epoch:1個epoch等於使用訓練集中的全部樣本訓練一次;

訓練log中各引數的意義 
Region Avg IOU:平均的IOU,代表預測的bounding box和ground truth的交集與並集之比,期望該值趨近於1。 
Class:是標註物體的概率,期望該值趨近於1. 
Obj:期望該值趨近於1. 
No Obj:期望該值越來越小但不為零. 
Avg Recall:期望該值趨近1 
avg:平均損失,期望該值趨近於0