深度學習——深卷積網絡:實例探究
1. 三個經典網絡
紅色部分不重要,現在已經不再使用
這篇文章較早,比如現在常用max,而當時用avg,當時也沒有softmax
這篇文章讓CV開始重視DL的使用,相對於LeNet-5,它的優點有兩個:更大,使用ReLU
以作者名字命名
same表示使用same過濾器,也就是輸入和輸出維度一致
16表示總共有16個CONV和FC,這篇文章指出了信道數和維度變化的規律性(隨網絡增加/減少),缺點是參數實在太多了
閱讀論文順序:2-3-1
2. 殘差網絡
殘差網絡由殘差塊組成,它使得網絡可以變得更深
a[l]到a[l+2]的藍色是網絡的主路徑,而紫色部分稱為短路/跳躍連接,直接把a[l]的信息傳遞到下下一層,計算a[l+2]時會加上a[l](殘差),它插入的位置是線性計算後,激活前
plain network是一般的網絡
在plain network中隨著深度增加,優化算法更難執行,所以可能會出現錯誤率先降後升的情況
網絡越深越難訓練:梯度消失/爆炸的問題
3. 為什麽Residual網絡有用
假設對一個大型網絡再增加兩層(構成殘差塊)
計算a[l+2]時,如果w為0,b也為0,且使用ReLu函數,那麽我們可以得到a[l+2] = a[l],這說明殘差網絡可以很容易學習恒等函數
因此,增加網絡深度不會損害性能,而plain網絡當深度增加時可能連恒等函數都不容易學習??
如果z[l+2]和a[l]維度一致就正好,如果不一樣的話,那麽可以在a[l]前乘以一個矩陣,不需要對矩陣進行處理??
殘差網絡的結構圖
4. 1x1卷積
1x1卷積做事情是:(以下面32信道為例)
對輸入的32個元素(32個信道)作一個全連接,然後執行ReLU函數,得到一個實數,作為相應位置上的結果。如果有多個過濾器,則進行疊加
這個也稱為網絡中的網絡
為什麽可以用1x1來壓縮?這樣如果采用一樣的過濾器,結果是不一樣的吧????
1x1卷積的作用
通過增加一個非線性函數使得信道數減少或保持不變(壓縮信道的方法),以減少計算量
使用32個1x1x192的過濾器
5. google Inception網絡
Inception可以幫你決定應該采用什麽樣的過濾器,是否需要pool層等
它的做法是把各種過濾器的結果堆疊在一起
下例中的維度是自己定義的,這樣最後輸出的結果中會有256個信道
下圖是一樣Inception的一個基礎塊
Inception的一個最大問題:計算量很大
以上例中5x5過濾器為例,就需要計算120M次乘法
解決方法:加一個1x1過濾器,也稱為bottleneck層(瓶頸層,是網絡中是小的層)
下例中計算量就會降成12.4M
6. 一個更完整些的Inception模塊
論文中的網絡結構
其實就是把上面的模塊重復連接,另外,網絡後面幾層會有一些分支(綠色劃圈部分),它們也是和最後的輸出一樣進行輸出,也就是說隱藏層也參與了最後y hat的輸出,這樣可以避免過擬合的問題
小故事:Inception原名是googlenet,是為了向LeNet致敬,而後引用了Inception(盜夢空間),意在建議更深的網絡
6. 遷移學習
在CV中經常會用到遷移學習。一般推薦使用開源的網絡來做,而非從0開始。根據擁有的數據量不同,有不同的處理方式,從上到下數據量遞增
例:要訓練一個識別貓的網絡(3個轉出)
當數據量很小的時候,可以把最後一層softmax替換掉,而把前面所有的層不變(一般有參數如trainable, freeze可以用於設置參數不變),只訓練最後一層
另外,可以把最後的隱藏層的結果保存下來,然後直接將輸入映射。這樣就不用經過中間層的計算
當數據量大一些的時候,可以多訓練幾層,也就是把前幾層freeze,而後面幾層進行訓練
當數據量很大時,可以對整個網絡進行訓練,原來訓練好的結果作為初始化值, 這樣就不用用隨機初始化
7. 數據擴充(augmentation)
對於CV應用,一般來說數據越多,網絡性能越好。對於其它應用可能不一定,但是對計算機視覺,數據量是一個重要的因素。數據擴充就是對原有數據進行處理以獲得更多的數據
常用的方法:mirror/random crop 其它幾個可能比較復雜就比較少用
第二種方法:改變顏色。有一種方法是PCA(主成分分析),根據原有的顏色比例進行調整,使得修改後的顏色和原來一致
data augmentation(增強)的實現
一般是用一個線程從硬盤加載數據進行修改,再把這些數據傳給其它的線程進行訓練。這樣數據處理與網絡訓練可以實現並行
超參數:顏色要改變多少,裁剪什麽位置等
8. 計算機視覺現狀
用於競賽的tips,一般不推薦用於真實應用上
深度學習——深卷積網絡:實例探究