深度學習中一些時而會忘的概念

Batch

什麼需要有 Batch_Size 這個參數?
Batch 的選擇,首先決定的是下降的方向。如果數據集比較小,完全可以採用全數據集 ( Full Batch Learning )的形式

另一個極端:就是每次只訓練一個樣本,即 Batch_Size = 1。這就是在線學習(Online Learning)。使用在線學習,每次修正方向以各自樣本的梯度方向修正,橫衝直撞各自爲政,難以達到收斂。
橢圓梯度
批梯度下降法(Mini-batches Learning)

在合理範圍內,增大 Batch_Size 有何好處?
• 內存利用率提高了,大矩陣乘法的並行化效率提高。
• 跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。減少訓練時間
• 在一定範圍內,一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓練震盪越小。

盲目增大 Batch_Size 有何壞處?
• 內存利用率提高了,但是內存容量可能撐不住了。
• 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
• 會導致模型泛化能力有所下降(但是時間足夠長則可以抵消)
• Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。

因而選一個折中數字
GPU對2的冪次的batch可以發揮更佳的性能,因此設置成16、32、64、128…時往往要比設置爲整10、整100的倍數時表現更優

iteration 以及 epoch:

1個iteration就等於使用batch_size個樣本進行訓練一次。
epoch則表示訓練集中的全部樣本訓練一次。
比如,1000個訓練樣本,batch_size=10,則1 epoch中有100個iteration。

max_evals

max_evals:表示要評估多少個檢查點。在培訓期間,試用作業將定期保存檢查點(例如,如果停止培訓,您不會丟失以前的所有工作;或者,您可以在通過n和m迭代分別創建的網絡之間進行選擇)。您通常會同時啓動一個評估作業,該作業將定期評估最後創建的檢查點,直至max_evals個檢查點。如果您不填寫此值,它將評估所有創建的檢查點,從而在培訓期間定期爲您提供評估性能

ROI Pooling

regions of interest(ROI)層能實現training和testing的顯著加速,並提高檢測accuracy
2個輸入:
a固定大小的feature maps; 通常叫share_conv
b一個表示所有ROI的N x 5的矩陣(N是ROI的數目)rois , RPN的輸出,一堆矩形候選框,單個形狀爲 1x5x1x1 其中4個座標+索引index,座標參考系針對的是原圖(CNN的輸入)
輸出:將不同大小的box矩形框,映射爲固定大小w x h的矩形框

  1. Conv layers使用的是VGG16,feat_stride=32(即表示,經過網絡層後圖片縮小爲原圖的1/32),原圖800800,最後一層特徵圖feature map大小:2525
  2. 假定原圖中有一region proposal,大小爲665x665,這樣,映射到特徵圖中的大小:665/32=20.78,即20.78x20.78,如果你看過Caffe的Roi Pooling的C++源碼,在計算的時候會進行取整操作,於是,進行所謂的第一次量化,即映射的特徵圖大小爲20*20
  3. 假定pooled_w=7,pooled_h=7,即pooling後固定成7x7大小的特徵圖,所以,將上面在 feature map上映射的20x20的 region proposal劃分成49個同等大小的小區域,每個小區域的大小20/7=2.86,即2.86*2.86,此時,進行第二次量化,故小區域大小變成2x2
  4. 每個2x2裏取最大值,得到7x7的feature map

優點:
6. 用於對象檢測任務
7. 它使我們能夠重用卷積網絡中的特徵圖
8. 它可以大大加快培訓和測試時間
9. 它允許以端到端的方式訓練物體檢測系統
缺點:
由於預選框的位置通常是由模型迴歸得到的,一般來講是浮點數,而池化後的特徵圖要求尺寸固定。故ROI Pooling這一操作存在兩次量化的過程。
存在兩次量化過程:
10. 將候選框邊界量化爲整數點座標值。
11. 將量化後的邊界區域平均分割成 k x k 個單元(bin),對每一個單元的邊界進行量化。
改進: ROI Align (以浮點型操作,用插值方法)

ROI Align

ROI時,預測ROI的座標爲(6.4, 12.8, 153.6, 172.8),特徵圖大小爲8×8,先要量化爲(1,1,4,5),再ROI Pooling時由於無法整除,再次量化。
在8x8上pool到3x3時, 採用雙線性差值計算

在這裏插入圖片描述

雙線性差值計算

雙線性差值無非就是用兩次線性差值而已,線性差值很好理解,就是等比平均。
下圖x1,x2爲普通像素點,x,y是差值之後得到的,就是按距離(小數)作爲權重取了兩個點的均值
在這裏插入圖片描述
雙線性內插法的計算比最鄰近點法複雜,計算量較大,但沒有灰度不連續的缺點,結果基本令人滿意。它具有低通濾波性質,使高頻分量受損,圖像輪廓可能會有一點模糊。

正則化:

指的是修改學習算法,使其降低泛化誤差,而非訓練誤差。
正則化一個學習函數,給代價函數添加被稱爲“正則化項regularizer”的懲罰因子。

L2L^2參數正則化,使得權重更加接近原點。又叫嶺迴歸,Tikhonov正則
能感知到有較高方差的輸入x,
因此與輸出目標協方差較小(相對增加方差)的特徵的權重會收縮

在這裏插入圖片描述
Eaug=Ein+λ2w2 E_{aug}=E_{in}+\frac{\lambda}{2}w^2
L1L^1正則化 :
L=Ein+λjwj L=E_{in}+\lambda\sum_j|w_j|
L2不會產生很多0,雖然限制了w的大小但是都還有值

  1. 相比L2正則化,L1正則化會得到更稀疏的解
    (最優值中一些參數爲0),廣泛用於特徵選擇(有可解釋性)

在這裏插入圖片描述
分別爲L2正則和L1正則

BN層

減均值,除以方差。(每個通道單獨進行,邊角特徵意義不同)
BN算法的強大之處在下面幾個方面:

  1. 可以選擇較大的學習率,使得訓練速度增長很快,具有快速收斂性。
  2. 可以不去理會Dropout,L2正則項參數的選擇,如果選擇使用BN,甚至可以去掉這兩項。
  3. 去掉局部響應歸一化層(LRN)。(AlexNet中使用的方法,BN層出來之後這個就不再用了)
  4. 可以把訓練數據打亂,防止每批訓練的時候,某一個樣本被經常挑選到。


網絡一旦訓練起來,參數就要發生更新,出了輸入層的數據外,其它層的數據分佈是一直髮生變化的,因爲在訓練的時候,網絡參數的變化就會導致後面輸入數據的分佈變化,比如第二層輸入,是由輸入數據和第一層參數得到的,而第一層的參數隨着訓練一直變化,勢必會引起第二層輸入分佈的改變,把這種改變稱之爲:Internal Covariate Shift

BN放置的位置
根據文獻說,BN可以應用於一個神經網絡的任何神經元上。
按照原文第一章的理論,應當在每一層的激活函數之後(例如ReLU=max(Wx+b,0)之後),對數據進行歸一化。
文獻主要是把BN變換,置於網絡激活函數層的前面。原文中BN在ReLU之前 防止大數字進入sigmoid的飽和區域
因此最後把BN層+激活函數層就變成了:

z=g(BN(Wu))

測試時BN使用
訓練階段的均值u、標準差σ來作爲測試樣本所需要的均值、標準差
在這裏插入圖片描述

for i in range(channel):
	x = input[:,:,:,i]
	mean = mean(x)
	variance = variance(x)
	x = (x - mean) / sqrt(variance)
	x = scale * x + offset
	input[:,:,:,i] = x

且各層BN的均值,方差參數要保存下來.
網絡上很多說訓練Is_traing=True,驗證時爲False.

var_list = tf.trainable_variables()
g_list = tf.global_variables()
bn_moving_vars = [g for g in g_list if 'moving_mean' in g.name]
bn_moving_vars += [g for g in g_list if 'moving_variance' in g.name]
var_list += bn_moving_vars
saver = tf.train.Saver(var_list=var_list, max_to_keep=5)

BN一般不用全量均值方差。
每一批數據的均值和方差會有一定的差別,而不是用固定的值,這個差別實際上能夠增加模型的魯棒性,也會在一定程度上減少過擬合。

也正是因此,BN一般要求將訓練集完全打亂,並用一個較大的batch值,否則,一個batch的數據無法較好得代表訓練集的分佈,會影響模型訓練的效果。

需要注意,在正向傳播時,會使用γ與β使得BN層輸出與輸入一樣。
在反向傳播時利用γ與β求得梯度從而改變訓練權值(變量)。
BN層是對於每個神經元做歸一化處理,甚至只需要對某一個神經元進行歸一化,而不是對一整層網絡的神經元進行歸一化。既然BN是對單個神經元的運算,那麼在CNN中卷積層上要怎麼搞?假如某一層卷積層有6個特徵圖,每個特徵圖的大小是100100,這樣就相當於這一層網絡有6100100個神經元,如果採用BN,就會有6100100個參數γ、β,這樣豈不是太恐怖了。因此卷積層上的BN使用,其實也是使用了類似權值共享的策略,把一整張特徵圖當做一個神經元進行處理。
卷積神經網絡經過卷積後得到的是一系列的特徵圖,如果min-batch sizes爲m,那麼網絡某一層輸入數據可以表示爲四維矩陣(m,f,w,h),m爲min-batch sizes,f爲特徵圖個數,w、h分別爲特徵圖的寬高。在CNN中我們可以把每個特徵圖看成是一個特徵處理(一個神經元),因此在使用Batch Normalization,mini-batch size 的大小就是:m
w*h,於是對於每個特徵圖都只有一對可學習參數:γ、β。說白了吧,這就是相當於求取所有樣本所對應的一個特徵圖的所有神經元的平均值、方差,然後對這個特徵圖神經元做歸一化。

BN 講的比較好:
https://www.cnblogs.com/CJT-blog/p/10424058.html

ResNet網絡理解

building Block塊、bottleneck塊

在這裏插入圖片描述
圖右爲 bottleneck
在這裏插入圖片描述
H(x)=F(x)+x,x是輸入,F(x)是卷積分支的輸出,H(x)是整個結構的輸出。可以證明如果F(x)分支中所有參數都是0,H(x)就是個恆等映射。殘差結構人爲製造了恆等映射,就能讓整個結構朝着恆等映射的方向去收斂,確保最終的錯誤率不會因爲深度的變大而越來越差。

圖5左右有相似的時間複雜度。圖5對應conv2輸出特徵圖爲56x56
左邊乘法次數: 3x3x64x56x56x64 x 2
右邊:1x1x256 x 56x56x64 + 3x3x64x56x56x64 + 1x1x64x56x56x256
化簡 8 x (64x56x56x64) 差別在9和8係數之間

BN層可以解決梯度消失,梯度爆炸,
過於深時準確率會飽和,然後下降。

SSD網絡

RetinaNet

Cascade R-CNN

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章