1. 程式人生 > >【基於tensorflow的學習】VGG、Goolenet、Resnet

【基於tensorflow的學習】VGG、Goolenet、Resnet

1.VGG

VGG實際上就是Alexnet的“加深版”,它其中比較出名的就是VGG16、VGG19。

它的加深不僅僅是層數的加深,VGG的conv-pool都是五層,但是它的特點在於每一層的conv-pool當中是幾層卷積層串聯之後再連線池化層的。還有它的一些訓練技巧。如圖所示:

它為什麼串聯呢?因為兩個3x3的卷積層疊加,等價於一個5x5的卷積核的效果,3個3x3的卷積核的疊加相當於一個7x7的卷積核,而且引數更少.大約是7x7卷積核卷積層的(3*3*3)/(7*7)=0.55.而且擁有和7x7卷積核一樣的感受視野,三個卷積層的疊加,經過了更多次的非線性變換,對特徵的學習能力更強。如圖所示:

 VGGnet的技巧:

  1. 在訓練時,先訓練級別A的簡單網路,再複用A網路的權重來初始化後面的幾個複雜模型,這樣訓練收斂的速度更快;
  2. 在預測時,VGG採用Multi-Scale的方法,將影象scale到一個尺寸Q,並將圖片輸入卷積網路計算。然後在最後一個卷積層用滑窗的方式進行分類預測,將不同視窗的分類結果平均,再將不同尺寸Q的結果平均得到最後結果,這樣可以提高圖片資料的利用率並提升預測準確率。
  3. 在訓練中,VGGnet還使用了Multi-Scale的方法做資料增強,將原始影象縮放到不同尺寸S,然後再隨機裁剪224*224的圖片,這樣能增加很多資料量,對於防止模型過擬合有很不錯的效果。實踐中,作者令S在[256,512]這個區間取值,使用Multi-Scale忽的多個版本的資料,並將多個版本的資料合在一起進行訓練。

 詳細解釋和程式碼可以參考:https://blog.csdn.net/u014281392/article/details/75152809

2.Google Inception Net

這個網路結構的神經學基礎是Hibbian原理:神經反射活動的持續與重複會導致神經元連結穩定性的持久提升,當兩個神經元細胞A和B距離很近,並且A參與了對B重複、持續的興奮,那麼某些代謝變化會導致A將作為能使B行風的細胞。意思就是“一起發射的神經元會連在一起”

受這個神經學的啟發,另一篇文章提出:一種聚類想法,我們應該把“相關性”高的一簇神經元節點連線在一起。而在圖片資料中,天然的就是臨近區域的資料相關性高,因此相鄰的畫素點被卷積操作連線在一起。而我們可能有多個卷積核,在同一空間位置但在不同通道的卷積核的輸出結果相關性極高。因此1*1卷積就可以很自然地把這些相關性很高的、在同一個空間位置但是不同通道的特徵連線在一起,這就是為什麼1*1卷積這麼頻繁地應用到IceptionNet中的原因。然後用稍微大一點的卷積核3*3、5*5以提取高維度的特徵的相關性。最後通過四個分支將相關性很高的節點連線在一起,構建出很高效的符合Hebbian原理的稀疏結構。

V2的特點是學習了VGG、使用了卷積串聯,還有就是用了著名的Batch Normalization方法(BN在用於神經網路某層時,會對每一個mini-batch的內部進行標準化處理,是輸出規範化到N(0,1)的正態分佈)。

V3就是把7*7卷積拆成1*7和7*1,這樣可以節約引數、減輕過擬合;還優化了Inception Module的結構,有35*35/17*17/8*8三種不同結構。V4就是結合了Resnet。詳情可見下面:

https://blog.csdn.net/App_12062011/article/details/62216987

程式碼實現:https://blog.csdn.net/akadiao/article/details/78634431

3.Resnet

它的重要結構就是skip connection:

 如果x的維度和F(x)不一樣,則可以運用y=F(x)+Wx,乘以一個權重矩陣來使得兩者維度一致,可以相加。

為什麼這個結構有用呢:轉自:https://www.jianshu.com/p/3d79e722ee56

假設從下一層網路傳回來的梯度為1(最右邊的數字),後向傳播的梯度數值如下面gif圖紅色數字表示:

那麼這裡可以看到,本來從上一層傳過來的梯度為1,經過這個block之後,得到的梯度已經變成了0.0001和0.01,也就是說,梯度流過一個blcok之後,就已經下降了幾個量級,傳到前一層的梯度將會變得很小!

這就是梯度彌散。假如模型的層數越深,這種梯度彌散的情況就更加嚴重,導致淺層部分的網路權重引數得不到很好的訓練,這就是為什麼在Resnet出現之前,CNN網路都不超過二十幾層的原因。

防止梯度彌散的辦法:

既然梯度經過一層層的卷積層會逐漸衰減,我們來考慮一個新的結構,如圖5:

假如,我們在這個block的旁邊加了一條“捷徑”(如圖5橙色箭頭),也就是常說的“skip connection”。假設左邊的上一層輸入為x,虛線框的輸出為f(x),上下兩條路線輸出的啟用值相加為h(x),即h(x) = F(x) + x,得出的h(x)再輸入到下一層。 

圖6

當進行後向傳播時,右邊來自深層網路傳回來的梯度為1,經過一個加法門,橙色方向的梯度為dh(x)/dF(x)=1,藍色方向的梯度也為1。這樣,經過梯度傳播後,現在傳到前一層的梯度就變成了[1, 0.0001, 0.01],多了一個“1”!正是由於多了這條捷徑,來自深層的梯度能直接暢通無阻地通過,去到上一層,使得淺層的網路層引數等到有效的訓練!

 

以往的經典結構: