【深度学习】基础知识--CNN:图像分类(上)
作者信息:
華校專,曾任阿里巴巴資深算法工程師、智易科技首席算法研究員,現任騰訊高級研究員,《Python 大戰機器學習》的作者。
編者按:
算法工程師必備系列更新啦!繼上次推出了算法工程師必備的數學基礎后,小編繼續整理了必要的機器學習知識,全部以干貨的內容呈現,哪里不會學哪里,老板再也不用擔心你的基礎問題!
CNN:圖像分類
ImageNet 數據集:一個開源的圖片數據集,包含超過 1400萬張圖片和圖片對應的標簽,包含2萬多個類別。
自從2010 年以來,ImageNet 每年舉辦一次比賽,即:ImageNet 大規模視覺識別挑戰賽ILSVRC ,比賽使用 1000 個類別圖片。
2017年7月,ImageNet 宣布ILSVRC 于2017 年正式結束,因為圖像分類、物體檢測、物體識別任務中計算機的正確率都遠超人類,計算機視覺在感知方面的問題基本得到解決,后續將專注于目前尚未解決的問題。
ImageNet 中使用兩種錯誤率作為評估指標:
top-5 錯誤率:對一個圖片,如果正確標記在模型輸出的前 5 個最佳預測(即:概率最高的前5個)中,則認為是正確的,否則認為是錯誤的。
最終錯誤預測的樣本數占總樣本數的比例就是 top-5 錯誤率。
top-1 錯誤率:對一個圖片,如果正確標記等于模型輸出的最佳預測(即:概率最高的那個),則認為是正確的,否則認為是錯誤的。
最終錯誤預測的樣本數占總樣本數的比例就是 top-1 錯誤率。
注:feature map 的描述有兩種:channel first,如256x3x3;channel last,如3x3x256 。這里如果未說明,則默認采用channel last描述。另外也可以顯式指定,如:3x3@256 。
一、LeNet
1998年LeCun 推出了LeNet 網絡,它是第一個廣為流傳的卷積神經網絡。
LeNet 網絡包含了卷積層、池化層、全連接層,這些都是現代CNN 網絡的基本組件。
| INPUT | - | - | - | - | 1@32x32 |
| C1 | 5x5 | 6 | 1 | 1@32x32 | 6@28x28 |
| S2 | 2x2 | - | 2 | 6@28x28 | 6@14x14 |
| C3 | 5x5 | 16 | 1 | 6@14x14 | 16@10x10 |
| S4 | 2x2 | - | 2 | 16@10x10 | 16@5x5 |
| C5 | 5x5 | 120 | 1 | 16@5x5 | 120@1x1 |
| F6 | - | - | - | 120 | 84 |
| OUTPUT | - | - | - | 84 | 10 |
輸入層:二維圖像,尺寸為32x32。
C1、C3、C5 層:二維卷積層。
其中C5 將輸入的 feature map(尺寸 16@5x5 )轉化為尺寸為120x1x1 的 feature map,然后轉換為長度為120 的一維向量。
這是一種常見的、將卷積層的輸出轉換為全連接層的輸入的一種方法。
S2、S4 層:池化層。使用sigmoid 函數作為激活函數。
后續的 CNN 都使用ReLU 作為激活函數。
F6 層:全連接層。
輸出層:由歐式徑向基函數單元組成。
后續的CNN 使用softmax 輸出單元。
上表中,@ 分隔了通道數量和feature map 的寬、高。
二、AlexNet
2012年Hinton 和他的學生推出了AlexNet 。在當年的ImageNet 圖像分類競賽中,AlexeNet 以遠超第二名的成績奪冠,使得深度學習重回歷史舞臺,具有重大歷史意義。
2.1 網絡結構
AlexNet 有5個廣義卷積層和3個廣義全連接層。
廣義的卷積層:包含了卷積層、池化層、ReLU、LRN 層等。
廣義全連接層:包含了全連接層、ReLU、Dropout 層等。
網絡結構如下表所示:
| 第0層 | 輸入層 | - | - | - | - | - | - | 3@224x224 |
| 第1層 | 廣義卷積層 | 卷積 | 11x11 | 96 | 4 | ReLU | 3@227x227 | 96@55x55 |
| 第1層 | 廣義卷積層 | 池化 | 3x3 | - | 2 | - | 96@55x55 | 96@27x27 |
| 第1層 | 廣義卷積層 | LRN | - | - | - | - | 96@27x27 | 96@27x27 |
| 第2層 | 廣義卷積層 | 卷積 | 5x5 | 256 | 1 | ReLU | 96@27x27 | 256@27x27 |
| 第2層 | 廣義卷積層 | 池化 | 3x3 | - | 2 | - | 256@27x27 | 256@13x13 |
| 第2層 | 廣義卷積層 | LRN | - | - | - | - | 256@13x13 | 256@13x13 |
| 第3層 | 廣義卷積層 | 卷積 | 3x3 | 384 | 1 | ReLU | 256@13x13 | 384@13x13 |
| 第4層 | 廣義卷積層 | 卷積 | 3x3 | 384 | 1 | ReLU | 384@13x13 | 384@13x13 |
| 第5層 | 廣義卷積層 | 卷積 | 3x3 | 256 | 1 | ReLU | 384@13x13 | 256@13x13 |
| 第5層 | 廣義卷積層 | 池化 | 3x3 | - | 2 | - | 256@13x13 | 256@6x6 |
| 第6層 | 廣義連接層 | 卷積 | 6x6 | 4096 | 1 | ReLU | 256@6x6 | 4096@1x1 |
| 第6層 | 廣義連接層 | dropout | - | - | - | - | 4096@1x1 | 4096@1x1 |
| 第7層 | 廣義連接層 | 全連接 | - | - | - | ReLU | 4096 | 4096 |
| 第7層 | 廣義連接層 | dropout | - | - | - | - | 4096 | 4096 |
| 第8層 | 廣義連接層 | 全連接 | - | - | - | - | 4096 | 1000 |
輸入層會將3@224x224 的三維圖片預處理變成3@227x227 的三維圖片。
第二層廣義卷積層、第四層廣義卷積層、第五層廣義卷積層都是分組卷積,僅采用本GPU 內的通道數據進行計算。
第一層廣義卷積層、第三層廣義卷積層、第六層連接層、第七層連接層、第八層連接層執行的是全部通道數據的計算。
第二層廣義卷積層的卷積、第三層廣義卷積層的卷積、第四層廣義卷積層的卷積、第五層廣義卷積層的卷積均采用same 填充。
當卷積的步長為1,核大小為3x3 時,如果不填充0,則feature map 的寬/高都會縮減 2 。因此這里填充0,使得輸出feature map 的寬/高保持不變。
其它層的卷積,以及所有的池化都是valid 填充(即:不填充 0 )。
第六層廣義連接層的卷積之后,會將feature map 展平為長度為 4096 的一維向量。
網絡參數數量:總計約 6237萬。
| 第0層 | 輸入層 | - | 227x227x3 | 0 | 0 | 0 |
| 第1層 | 廣義卷積層 | 卷積 | 55x55x96 | 34848 | 96 | 34944 |
| 第1層 | 廣義卷積層 | 池化 | 27x27x96 | 0 | 0 | 0 |
| 第1層 | 廣義卷積層 | LRN | 27x27x96 | 0 | 0 | 0 |
| 第2層 | 廣義卷積層 | 卷積 | 27x27x256 | 614400 | 256 | 614656 |
| 第2層 | 廣義卷積層 | 池化 | 13x13x256 | 0 | 0 | 0 |
| 第2層 | 廣義卷積層 | LRN | 13x13x256 | 0 | 0 | 0 |
| 第3層 | 廣義卷積層 | 卷積 | 13x13x384 | 884736 | 384 | 885120 |
| 第4層 | 廣義卷積層 | 卷積 | 13x13x384 | 1327104 | 384 | 1327488 |
| 第5層 | 廣義卷積層 | 卷積 | 13x13x256 | 884736 | 256 | 884992 |
| 第5層 | 廣義卷積層 | 池化 | 6x6x256 | 0 | 0 | 0 |
| 第6層 | 廣義連接層 | 卷積 | 4096×1 | 37748736 | 4096 | 37752832 |
| 第6層 | 廣義連接層 | dropout | 4096×1 | 0 | 0 | 0 |
| 第7層 | 廣義連接層 | 全連接 | 4096×1 | 16777216 | 4096 | 16781312 |
| 第7層 | 廣義連接層 | dropout | 4096×1 | 0 | 0 | 0 |
| 第8層 | 廣義連接層 | 全連接 | 1000×1 | 4096000 | 1000 | 4097000 |
| 總計 | - | - | - | - | - | 62,378,344 |
輸出Tensor size 采用channel last 風格描述。即227x227x3 等價于前文的 3@227x227 。
第6層廣義連接層的卷積的參數數量最多,約3770萬,占整體六千萬參數的 60%。
原因是該子層的卷積核較大、輸入通道數量較大、輸出通道數量太多。該卷積需要的參數數量為: 。
2.2 設計技巧
AlexNet 成功的主要原因在于:
使用ReLU 激活函數。
使用dropout、數據集增強 、重疊池化等防止過擬合的方法。
使用百萬級的大數據集來訓練。
使用GPU訓練,以及的LRN 使用。
使用帶動量的 mini batch 隨機梯度下降來訓練。
2.2.1 數據集增強
AlexNet 中使用的數據集增強手段:
隨機裁剪、隨機水平翻轉:原始圖片的尺寸為256xx256,裁剪大小為224x224。
每一個epoch 中,對同一張圖片進行隨機性的裁剪,然后隨機性的水平翻轉。理論上相當于擴充了數據集 倍。
在預測階段不是隨機裁剪,而是固定裁剪圖片四個角、一個中心位置,再加上水平翻轉,一共獲得 10 張圖片。
用這10張圖片的預測結果的均值作為原始圖片的預測結果。
PCA 降噪:對RGB空間做PCA 變換來完成去噪功能。同時在特征值上放大一個隨機性的因子倍數(單位1 加上一個 的高斯繞動),從而保證圖像的多樣性。
每一個epoch 重新生成一個隨機因子。
該操作使得錯誤率下降1% 。
AlexNet 的預測方法存在兩個問題:
這種固定裁剪四個角、一個中心的方式,把圖片的很多區域都給忽略掉了。很有可能一些重要的信息就被裁剪掉。
裁剪窗口重疊,這會引起很多冗余的計算。
改進的思路是:
執行所有可能的裁剪方式,對所有裁剪后的圖片進行預測。將所有預測結果取平均,即可得到原始測試圖片的預測結果。
減少裁剪窗口重疊部分的冗余計算。
具體做法為:將全連接層用等效的卷積層替代,然后直接使用原始大小的測試圖片進行預測。將輸出的各位置處的概率值按每一類取平均(或者取最大),則得到原始測試圖像的輸出類別概率。
下圖中:上半圖為AlexNet 的預測方法;下半圖為改進的預測方法。
2.2.2 局部響應規范化
局部響應規范層LRN:目地是為了進行一個橫向抑制,使得不同的卷積核所獲得的響應產生競爭。
LRN 層現在很少使用,因為效果不是很明顯,而且增加了內存消耗和計算時間。
在AlexNet 中,該策略貢獻了1.2% 的貢獻率。
LRN 的思想:輸出通道 i 在位置 (x,y) 處的輸出會受到相鄰通道在相同位置輸出的影響。
為了刻畫這種影響,將輸出通道 i 的原始值除以一個歸一化因子。
其中: 為輸出通道 i 在位置 處的原始值, 為歸一化之后的值。n 為影響第 i 通道的通道數量(分別從左側、右側 個通道考慮)。 為超參數。
一般考慮 。
2.2.3 多GPU 訓練
AlexNet 使用兩個GPU訓練。網絡結構圖由上、下兩部分組成:一個GPU運行圖上方的通道數據,一個GPU 運行圖下方的通道數據,兩個GPU 只在特定的網絡層通信。即:執行分組卷積。
第二、四、五層卷積層的核只和同一個GPU 上的前一層的feature map 相連。
第三層卷積層的核和前一層所有GPU 的feature map 相連。
全連接層中的神經元和前一層中的所有神經元相連。
2.2.4 重疊池化
一般的池化是不重疊的,池化區域的大小與步長相同。Alexnet 中,池化是可重疊的,即:步長小于池化區域的大小。
重疊池化可以緩解過擬合,該策略貢獻了0.4% 的錯誤率。
為什么重疊池化會減少過擬合,很難用數學甚至直觀上的觀點來解答。一個稍微合理的解釋是:重疊池化會帶來更多的特征,這些特征很可能會有利于提高模型的泛化能力。
2.2.5 優化算法
AlexNet 使用了帶動量的mini-batch 隨機梯度下降法。
標準的帶動量的mini-batch 隨機梯度下降法為:
而論文中,作者使用了修正:
402 Payment Required
其中 ,, 為學習率。
為權重衰減。論文指出:權重衰減對于模型訓練非常重要,不僅可以起到正則化效果,還可以減少訓練誤差。
三、VGG-Net
VGG-Net 是牛津大學計算機視覺組和DeepMind公司共同研發一種深度卷積網絡,并且在2014年在ILSVRC比賽上獲得了分類項目的第二名和定位項目的第一名。
VGG-Net 的主要貢獻是:
證明了小尺寸卷積核(3x3 )的深層網絡要優于大尺寸卷積核的淺層網絡。
證明了深度對網絡的泛化性能的重要性。
驗證了尺寸抖動scale jittering 這一數據增強技術的有效性。
VGG-Net 最大的問題在于參數數量,VGG-19 基本上是參數數量最多的卷積網絡架構。
3.1 網絡結構
VGG-Net 一共有五組結構(分別表示為:A~E ), 每組結構都類似,區別在于網絡深度上的不同。
結構中不同的部分用黑色粗體給出。
卷積層的參數為convx-y,其中x 為卷積核大小,y 為卷積核數量。
如:conv3-64 表示 64 個 3x3 的卷積核。
卷積層的通道數剛開始很小(64通道),然后在每個池化層之后的卷積層通道數翻倍,直到512。
每個卷積層之后都跟隨一個ReLU激活函數,表中沒有標出。
通用結構:
輸入層:固定大小的224x224 的RGB 圖像。
卷積層:卷積步長均為1。
填充方式:填充卷積層的輸入,使得卷積前后保持同樣的空間分辨率。
3x3 卷積:same 填充,即:輸入的上下左右各填充1個像素。
1x1 卷積:不需要填充。
卷積核尺寸:有3x3 和1x1 兩種。
3x3 卷積核:這是捕獲左右、上下、中心等概念的最小尺寸。
1x1 卷積核:用于輸入通道的線性變換。
在它之后接一個ReLU 激活函數,使得輸入通道執行了非線性變換。
池化層:采用最大池化。
池化層連接在卷積層之后,但并不是所有的卷積層之后都有池化。
池化窗口為2x2,步長為 2 。
網絡最后四層為::三個全連接層 + 一個softmax 層。
前兩個全連接層都是 4096個神經元,第三個全連接層是 1000 個神經元(因為執行的是 1000 類的分類)。
最后一層是softmax 層用于輸出類別的概率。
所有隱層都使用ReLU 激活函數。
VGG-Net 網絡參數數量:
其中第一個全連接層的參數數量為:7x7x512x4096=1.02億 ,因此網絡絕大部分參數來自于該層。
與AlexNet 相比,VGG-Net 在第一個全連接層的輸入feature map 較大:7x7 vs 6x6,512 vs 256 。
| 參數數量 | 1.13億 | 1.33億 | 1.34億 | 1.38億 | 1.44 |
3.2 設計技巧
輸入預處理:通道像素零均值化。
先統計訓練集中全部樣本的通道均值:所有紅色通道的像素均值 、所有綠色通道的像素均值 、所有藍色通道的像素均值 。
其中:假設紅色通道為通道0,綠色通道為通道1,藍色通道為通道2 ;n 遍歷所有的訓練樣本,i,j 遍歷圖片空間上的所有坐標。
對每個樣本:紅色通道的每個像素值減去 ,綠色通道的每個像素值減去 ,藍色通道的每個像素值減去 。
多尺度訓練:將原始的圖像縮放到最小的邊 ,然后在整副圖像上截取224x224 的區域來訓練。
有兩種方案:
在所有圖像上固定 S :用 S=256 來訓練一個模型,用 S=384 來訓練另一個模型。最后使用兩個模型來評估。
對每個圖像,在 之間隨機選取一個 S ,然后進行裁剪來訓練一個模型。最后使用單個模型來評估。
該方法只需要一個單一的模型。
該方法相當于使用了尺寸抖動(scale jittering) 的數據增強。
多尺度測試:將測試的原始圖像等軸的縮放到預定義的最小圖像邊,表示為 Q (Q 不一定等于 S ),稱作測試尺度。
在一張測試圖像的幾個歸一化版本上運行模型,然后對得到的結果進行平均。
該方法相當于在測試時使用了尺寸抖動。實驗結果表明:測試時的尺寸抖動導致了更好的性能。
不同版本對應于不同的 Q 值。
所有版本都執行通道像素歸一化。注意:采用訓練集的統計量。
評估有三種方案:
single-crop:對測試圖片沿著最短邊縮放,然后選擇其中的 center crop 來裁剪圖像,選擇這個圖像的預測結果作為原始圖像的預測結果。
該方法的缺點是:僅僅保留圖片的中央部分可能會丟掉圖片類別的關鍵信息。因此該方法很少在實際任務中使用,通常用于不同模型之間的性能比較。
multi-crop:類似AlexNet 的做法,對每個測試圖像獲取多個裁剪圖像,平均每個裁剪圖像的預測結果為原始圖像的預測結果。
該方法的缺點是:需要網絡重新計算每個裁剪圖像,效率較低。
dense:將最后三個全連接層用等效的卷積層替代,成為一個全卷積網絡。其中:第一個全連接層用7x7 的卷積層替代,后面兩個全連接層用1x1 的卷積層替代。
該全卷積網絡應用到整張圖片上(無需裁剪),得到一個多位置的、各類別的概率字典。通過原始圖片、水平翻轉圖片的各類別預測的均值,得到原始圖片的各類別概率。
該方法的優點是:不需要裁剪圖片,支持多尺度的圖片測試,計算效率較高。
實驗結果表明:multi-crop 評估方式要比dense 評估方式表現更好。另外,二者是互補的,其組合要優于任何單獨的一種。下表中,S=[256;512],Q={256,384,512} 。
還有一種評估策略:ensemble error 。即:同時訓練同一種網絡的多個不同的模型,然后用這幾個模型的預測結果的平均誤差作為最終的 ensemble error 。
有一種術語叫single-model error。它是訓練一個模型,然后采用上述的多種crop/dense 評估的組合,這些組合的平均輸出作為預測結果。
權重初始化:由于網絡深度較深,因此網絡權重的初始化很重要,設計不好的初始化可能會阻礙學習。
論文的權重初始化方案為:先訓練結構A 。當訓練更深的配置時,使用結構A 的前四個卷積層和最后三個全連接層來初始化網絡,網絡的其它層被隨機初始化。
作者后來指出:可以通過 Xavier均勻初始化來直接初始化權重而不需要進行預訓練。
實驗結果表明:
分類誤差隨著網絡深度的增加而減小。
從A-LRN 和 A 的比較發現:局部響應歸一化層LRN 對于模型沒有任何改善。
四、Inception
Inception 網絡是卷積神經網絡的一個重要里程碑。在Inception 之前,大部分流行的卷積神經網絡僅僅是把卷積層堆疊得越來越多,使得網絡越來越深。這使得網絡越來越復雜,參數越來越多,從而導致網絡容易出現過擬合,增加計算量。
而Inception 網絡考慮的是多種卷積核的并行計算,擴展了網絡的寬度。
Inception Net 核心思想是:稀疏連接。因為生物神經連接是稀疏的。
Inception 網絡的最大特點是大量使用了Inception 模塊。
4.1 Inception v1
4.1.1 網絡結構
InceptionNet V1 是一個22層的深度網絡。如果考慮池化層,則有29層。如下圖中的depth 列所示。
網絡具有三組Inception 模塊,分別為:inception(3a)/inception(3b)、inception(4a)/inception(4b)/inception(4c)/inception(4d)/inception(4e)、inception(5a)、inception(5b)。三組Inception 模塊被池化層分隔。
下圖給出了網絡的層次結構和參數,其中:
type 列:給出了每個模塊/層的類型。
patch size/stride 列:給出了卷積層/池化層的尺寸和步長。
output size 列:給出了每個模塊/層的輸出尺寸和輸出通道數。
depth列:給出了每個模塊/層包含的、含有訓練參數層的數量。
#1x1列:給出了每個模塊/層包含的1x1 卷積核的數量,它就是1x1 卷積核的輸出通道數。
#3x3 reduce列:給出了每個模塊/層包含的、放置在3x3 卷積層之前的1x1 卷積核的數量,它就是1x1 卷積核的輸出通道數。
#3x3列:給出了每個模塊/層包含的3x3 卷積核的數量,它就是3x3 卷積核的輸出通道數。
#5x5 reduce列:給出了每個模塊/層包含的、放置在5x5 卷積層之前的1x1 卷積核的數量,它就是1x1 卷積核的輸出通道數。
#5x5列:給出了每個模塊/層包含的5x5 卷積核的數量,它就是5x5卷積核的輸出通道數。
pool proj列:給出了每個模塊/層包含的、放置在池化層之后的1x1 卷積核的數量,它就是1x1 卷積核的輸出通道數。
params列:給出了每個模塊/層的參數數量。
ops列:給出了每個模塊/層的計算量。
Inception V1 的參數數量為 697.7 萬,其參數數量遠遠小于AlexNet(6千萬)、VGG-Net(超過1億)。
Inception V1 參數數量能縮減的一個主要技巧是:在inception(5b)輸出到linear之間插入一個平均池化層avg pool。
如果沒有平均池化層,則inception(5b) 到 linear 之間的參數數量為:7x7x1024x1024,約為 5 千萬。
插入了平均池化層之后,inception(5b) 到 linear 之間的參數數量為:1x1x1024x1024,約為 1百萬。
4.1.2 Inception 模塊
原始的Inception 模塊對輸入同時執行:3個不同大小的卷積操作(1x1、3x3、5x5)、1個最大池化操作(3x3 )。所有操作的輸出都在深度方向拼接起來,向后一級傳遞。
三種不同大小卷積:通過不同尺寸的卷積核抓取不同大小的對象的特征。
使用1x1、3x3、5x5 這些具體尺寸僅僅是為了便利性,事實上也可以使用更多的、其它尺寸的濾波器。
1個最大池化:提取圖像的原始特征(不經過過濾器)。
原始Inception 模塊中,模塊的輸出通道數量為四個子層的輸出通道數的疊加。這種疊加不可避免的使得Inception 模塊的輸出通道數增加,這就增加了Inception 模塊中每個卷積的計算量。因此在經過若干個模塊之后,計算量會爆炸性增長。
解決方案是:在3x3 和 5x5 卷積層之前額外添加1x1 卷積層,來限制輸入給卷積層的輸入通道的數量。
注意:
1x1 卷積是在最大池化層之后,而不是之前。這是因為:池化層是為了提取圖像的原始特征,一旦它接在1x1 卷積之后就失去了最初的本意。
1x1 卷積在3x3、5x5 卷積之前。這是因為:如果1x1 卷積在它們之后,則3x3 卷積、5x5 卷積的輸入通道數太大,導致計算量仍然巨大。
4.1.3 輔助分類器
為了緩解梯度消失的問題,InceptionNet V1 給出了兩個輔助分類器。這兩個輔助分類器被添加到網絡的中間層,它們和主分類器共享同一套訓練數據及其標記。其中:
第一個輔助分類器位于Inception(4a) 之后,Inception(4a) 模塊的輸出作為它的輸入。
第二個輔助分類器位于Inception(4d) 之后,Inception(4d) 模塊的輸出作為它的輸入。
兩個輔助分類器的結構相同,包括以下組件:
一個尺寸為5x5、步長為3的平均池化層。
一個尺寸為1x1、輸出通道數為128 的卷積層。
一個具有1024 個單元的全連接層。
一個drop rate = 70%的 dropout 層。
一個使用softmax 損失的線性層作為輸出層。
在訓練期間,兩個輔助分類器的損失函數的權重是0.3,它們的損失被疊加到網絡的整體損失上。在推斷期間,這兩個輔助網絡被丟棄。
在Inception v3 的實驗中表明:輔助網絡的影響相對較小,只需要其中一個就能夠取得同樣的效果。
事實上輔助分類器在訓練早期并沒有多少貢獻。只有在訓練接近結束,輔助分支網絡開始發揮作用,獲得超出無輔助分類器網絡的結果。
兩個輔助分類器的作用:提供正則化的同時,克服了梯度消失問題。
4.2 Inception v2
Inception v2 的主要貢獻是提出了Batch Normalization 。論文指出,使用了Batch Normalization 之后:
可以加速網絡的學習。
相比Inception v1,訓練速度提升了14倍。因為應用了BN 之后,網絡可以使用更高的學習率,同時刪除了某些層。
網絡具有更好的泛化能力。
在ImageNet 分類問題的top5 上達到4.8%,超過了人類標注 top5 的準確率。
Inception V2 網絡訓練的技巧有:
使用更高的學習率。
刪除dropout層、LRN 層。
減小L2 正則化的系數。
更快的衰減學習率。學習率以指數形式衰減。
更徹底的混洗訓練樣本,使得一組樣本在不同的epoch 中處于不同的mini batch 中。
減少圖片的形變。
Inception v2 的網絡結構比Inception v1 有少量改動:
5x5 卷積被兩個3x3 卷積替代。
這使得網絡的最大深度增加了 9 層,同時網絡參數數量增加 25%,計算量增加 30%。
28x28 的inception 模塊從2個增加到3個。
在inception 模塊中,有的采用最大池化,有的采用平均池化。
在inception 模塊之間取消了用作連接的池化層。
inception(3c),inception(4e) 的子層采用步長為 2 的卷積/池化。
Pool+proj 列給出了inception 中的池化操作。
avg+32 意義為:平均池化層后接一個尺寸1x1、輸出通道32 的卷積層。
max+pass through 意義為:最大池化層后接一個尺寸1x1、輸出通道數等于輸入通道數的卷積層。
Inception V2 的網絡參數約為1126 萬。
| conv1 | 9408 |
| conv2 | 114688 |
| inception-3a | 218094 |
| inception-3b | 259072 |
| inception-3c | 384000 |
| inception-4a | 608193 |
| inception-4b | 663552 |
| inception-4c | 912384 |
| inception-4d | 1140736 |
| inception-4e | 1447936 |
| inception-5a | 2205696 |
| inception-5b | 2276352 |
| fc | 1024000 |
| 共 | 11264111 |
Inception V2 在ImageNet 測試集上的誤差率:
4.3 Inception v3
雖然Inception v1 的參數較少,但是它的結構比較復雜,難以進行修改。原因有以下兩點:
因此Inception v3 的論文重點探討了網絡結構設計的原則。
如果單純的放大網絡(如增加Inception 模塊的數量、擴展Inception 模塊的大小),則參數的數量會顯著增長,計算代價太大。
Inception v1 結構中的各種設計,其對最終結果的貢獻尚未明確。
4.3.1 網絡結構
Inception v3 的網絡深度為42層,它相對于Inception v1 網絡主要做了以下改動:
7x7 卷積替換為3個3x3 卷積。
3個Inception模塊:模塊中的5x5 卷積替換為2個3x3 卷積,同時使用后面描述的網格尺寸縮減技術。
5個Inception 模塊:模塊中的5x5 卷積替換為2個3x3 卷積之后,所有的nxn 卷積進行非對稱分解,同時使用后面描述的網格尺寸縮減技術。
2個Inception 模塊:結構如下。它也使用了卷積分解技術,以及網格尺寸縮減技術。
Inception v3 的網絡結構如下所示:
3xInception 表示三個Inception 模塊,4xInception 表示四個Inception 模塊,5xInception 表示五個Inception 模塊。
conv padded 表示使用0填充的卷積,它可以保持feature map 的尺寸。
在Inception 模塊內的卷積也使用0填充,所有其它的卷積/池化不再使用填充。
在3xInception 模塊的輸出之后設有一個輔助分類器。其結構如下:
Inception v3 整體參數數量約 23,626,728萬(論文Xception: Deep Learning with Depthwise Separable Convolutions)。
4.3.2 設計技巧
Inception v3 總結出網絡設計的一套通用設計原則:
representation 大小通常指的是feature map 的容量,即feature map 的width x height x channel 。
空間聚合:可以通過空間聚合來完成低維嵌入,而不會在表達能力上有較大的損失。因此通常在nxn 卷積之前,先利用1x1 卷積來降低輸入維度。
猜測的原因是:空間維度之間的強相關性導致了空間聚合過程中的信息丟失較少。
平衡網絡的寬度和深度:增加網絡的寬度或者深度都可以提高網絡的泛化能力,因此計算資源需要在網絡的深度和寬度之間取得平衡。
避免representation 瓶頸:representation 的大小應該從輸入到輸出緩緩減小,避免極端壓縮。在縮小feature map 尺寸的同時,應該增加feature map 的通道數。
4.3.2.1 卷積尺寸分解
大卷積核的分解:將大卷積核分解為多個小的卷積核。
如:使用2個3x3 卷積替換5x5 卷積,則其參數數量大約是1個5x5 卷積的 72% 。
nxn 卷積核的非對稱分解:將nxn 卷積替換為1xn 卷積和nx1 卷積。
這種非對稱分解的參數數量是原始卷積數量的 。隨著n 的增加,計算成本的節省非常顯著。
論文指出:對于較大的feature map ,這種分解不能很好的工作;但是對于中等大小的 feature map (尺寸在12~20 之間),這種分解效果非常好。
4.3.2.2 網格尺寸縮減
假設輸入的feature map 尺寸為dxd,通道數為k。如果希望輸出的feature map 尺寸為d/2 x d/2,通道數為2k。則有以下的兩種方式:
事實上每個Inception 模塊都會使得feature map 尺寸縮半、通道翻倍,因此在這個過程中需要仔細設計網絡,使得既能夠保證網絡的表征能力,又不至于計算代價太大。
首先使用2k 個 1x1 的卷積核,執行步長為1的卷積。然后執行一個2x2 的、步長為2的池化操作。
該方式需要執行 2d^2k^2 次乘-加操作,計算代價較大。
直接使用2k 個1x1 的卷積核,執行步長為2的卷積。
該方式需要執行 次乘-加操作,計算代價相對較小。但是表征能力下降,產生了表征瓶頸。
解決方案是:采用兩個模塊P 和 C 。
將模塊P 和模塊C 的輸出按照通道數拼接,產生最終的輸出feature map 。
模塊P :使用k 個1x1 的卷積核,執行步長為2的卷積。其輸出feature map 尺寸為d/2 x d/2,通道數為k。
模塊C:使用步長為2的池化。其輸出feature map 尺寸為d/2 x d/2,通道數為k。
4.3.2.3 標簽平滑正則化
標簽平滑正則化的原理:假設樣本的真實標記存在一定程度上的噪聲。即:樣本的真實標記不一定是可信的。
對給定的樣本 ,其真實標記為 y 。在普通的訓練中,該樣本的類別分布為一個 函數:。記做 。
采用標簽平滑正則化(LSR:Label Smoothing Regularization)之后,該樣本的類別分布為:
402 Payment Required
其中 是一個很小的正數(如 0.1),其物理意義為:樣本標簽不可信的比例。
該類別分布的物理意義為:
樣本 的類別為 y 的概率為 。
樣本 的類別為 的概率均 。
論文指出:標簽平滑正則化對top-1 錯誤率和top-5 錯誤率提升了大約 0.2% 。
4.4 Inception v4 & Inception - ResNet
Inception v4 和 Inception-ResNet 在同一篇論文中給出。論文通過實驗證明了:結合殘差連接可以顯著加速Inception 的訓練。
性能比較:(綜合采用了 144 crops/dense 評估的結果,數據集:ILSVRC 2012 的驗證集 )
| ResNet-151 | dense | 19.4% | 4.5% |
| Inception-v3 | 144 | 18.9% | 4.3% |
| Inception-ResNet-v1 | 144 | 18.8% | 4.3% |
| Inception-v4 | 144 | 17.7% | 3.8% |
| Inception-ResNet-v2 | 144 | 17.8% | 3.7% |
Inception-ResNet-v2 參數數量約為 5500萬,Inception-ResNet-v1/Inception-v4 的參數數量也在該量級。
4.4.1 Inception v4
在Inception v4 結構的主要改動:
修改了 stem 部分。
引入了Inception-A、Inception-B、Inception-C 三個模塊。這些模塊看起來和Inception v3 變體非常相似。
Inception-A/B/C 模塊中,輸入feature map 和輸出feature map 形狀相同。而Reduction-A/B 模塊中,輸出feature map 的寬/高減半、通道數增加。
引入了專用的“縮減塊”(reduction block),它被用于縮減feature map 的寬、高。
早期的版本并沒有明確使用縮減塊,但是也實現了其功能。
Inception v4 結構如下:(沒有標記V 的卷積使用same填充;標記V 的卷積使用valid 填充)
| Inception-v4 | 192 | 224 | 256 | 384 |
| Inception-ResNet-v1 | 192 | 192 | 256 | 384 |
| Inception-ResNet-v2 | 256 | 256 | 256 | 384 |
Reduction-B模塊:
stem 部分的結構:
Inception-A模塊(這樣的模塊有4個):
Inception-B模塊(這樣的模塊有7個):
Inception-C模塊(這樣的模塊有3個):
Reduction-A模塊:(其中 k,l,m,n 分別表示濾波器的數量)
4.4.2 Inception-ResNet
在Inception-ResNet 中,使用了更廉價的Inception 塊:inception 模塊的池化運算由殘差連接替代。
在Reduction 模塊中能夠找到池化運算。
Inception ResNet 有兩個版本:v1 和 v2 。
v1 的計算成本和Inception v3 的接近,v2 的計算成本和Inception v4 的接近。
v1 和v2 具有不同的stem 。
兩個版本都有相同的模塊A、B、C 和縮減塊結構,唯一不同在于超參數設置。
Inception-ResNet-v1 結構如下:
stem 部分的結構:
Inception-ResNet-A模塊(這樣的模塊有5個):
Inception-B模塊(這樣的模塊有10個):
Inception-C模塊(這樣的模塊有5個):
Reduction-A模塊:同inception_v4 的 Reduction-A模塊
Reduction-B模塊:
Inception-ResNet-v2 結構與Inception-ResNet-v1 基本相同 :
Inception-ResNet-A模塊(這樣的模塊有5個):它的結構與Inception-ResNet-v1 的Inception-ResNet-A相同,只是通道數發生了改變。
Inception-B模塊(這樣的模塊有10個):它的結構與Inception-ResNet-v1 的Inception-ResNet-B相同,只是通道數發生了改變。
Inception-C模塊(這樣的模塊有5個):它的結構與Inception-ResNet-v1 的Inception-ResNet-C相同,只是通道數發生了改變。
Reduction-A模塊:同inception_v4 的 Reduction-A模塊。
Reduction-B模塊:它的結構與Inception-ResNet-v1 的Reduction-B相同,只是通道數發生了改變。
stem 部分的結構:同inception_v4 的 stem 部分。Inception-ResNet-v2?使用了inception v4?的?stem?部分,因此后續的通道數量與Inception-ResNet-v1?不同。
如果濾波器數量超過1000,則殘差網絡開始出現不穩定,同時網絡會在訓練過程早期出現“死亡”:經過成千上萬次迭代之后,在平均池化之前的層開始只生成 0 。
解決方案:在殘差模塊添加到activation 激活層之前,對其進行縮放能夠穩定訓練。降低學習率或者增加額外的BN都無法避免這種狀況。
這就是Inception ResNet 中的 Inception-A,Inception-B,Inception-C 為何如此設計的原因。
將Inception-A,Inception-B,Inception-C 放置在兩個Relu activation 之間。
通過線性的1x1 Conv(不帶激活函數)來執行對殘差的線性縮放。
4.5 Xception
一個常規的卷積核嘗試在三維空間中使用濾波器抽取特征,包括:兩個空間維度(寬度和高度)、一個通道維度。因此單個卷積核的任務是:同時映射跨通道的相關性和空間相關性。
Inception 將這個過程明確的分解為一系列獨立的相關性的映射:要么考慮跨通道相關性,要么考慮空間相關性。Inception 的做法是:
一個典型的Inception 模塊(Inception V3 )如下
可以簡化為:
首先通過一組1x1 卷積來查看跨通道的相關性,將輸入數據映射到比原始輸入空間小的三個或者四個獨立空間。
然后通過常規的3x3 或者 5x5 卷積,將所有的相關性(包含了跨通道相關性和空間相關性)映射到這些較小的三維空間中。
Xception 將這一思想發揮到極致:首先使用1x1 卷積來映射跨通道相關性,然后分別映射每個輸出通道的空間相關性,從而將跨通道相關性和空間相關性解耦。因此該網絡被稱作Xception:Extreme Inception ,其中的Inception 塊被稱作 Xception 塊。
Xception 塊類似于深度可分離卷積,但是它與深度可分離卷積之間有兩個細微的差異:
其中第二個差異更為重要。
操作順序不同:
深度可分離卷積通常首先執行channel-wise 空間卷積,然后再執行1x1 卷積。
Xception 塊首先執行1x1 卷積,然后再進行channel-wise 空間卷積。
第一次卷積操作之后是否存在非線性:
深度可分離卷積只有第二個卷積(1x1 )使用了ReLU 非線性激活函數,channel-wise 空間卷積不使用非線性激活函數。
Xception 塊的兩個卷積(1x1 和 3x3 )都使用了ReLU 非線性激活函數。
對Xception 進行以下的修改,都可以加快網絡收斂速度,并獲取更高的準確率:
引入類似ResNet 的殘差連接機制。
在1x1 卷積和3x3 卷積之間不加入任何非線性。
Xception 的參數數量與Inception V3 相同,但是性能表現顯著優于Inception V3 。這表明Xception 更加高效的利用了模型參數。
| VGG-16 | 71.5% | 90.1% |
| ResNet-152 | 77.0% | 93.3% |
| Inception V3 | 78.2% | 94.1% |
| Xception | 79.0% | 94.5% |
根據論文Xception: Deep Learning with Depthwise Separable Convolutions,Inception V3 參數數量為 23626728,Xception 參數數量為 22855952 。
在ImageNet 上的benchmark 為(單個模型,單次crop ):
五、ResNet
ResNet 提出了一種殘差學習框架來解決網絡退化問題,從而訓練更深的網絡。這種框架可以結合已有的各種網絡結構,充分發揮二者的優勢。
ResNet以三種方式挑戰了傳統的神經網絡架構:
ResNet 通過引入跳躍連接來繞過殘差層,這允許數據直接流向任何后續層。
這與傳統的、順序的pipeline 形成鮮明對比:傳統的架構中,網絡依次處理低級feature 到高級feature 。
ResNet 的層數非常深,高達1202層。而ALexNet 這樣的架構,網絡層數要小兩個量級。
通過實驗發現,訓練好的 ResNet 中去掉單個層并不會影響其預測性能。而訓練好的AlexNet 等網絡中,移除層會導致預測性能損失。
在ImageNet分類數據集中,擁有152層的殘差網絡,以3.75% top-5 的錯誤率獲得了ILSVRC 2015 分類比賽的冠軍。
很多證據表明:殘差學習是通用的,不僅可以應用于視覺問題,也可應用于非視覺問題。
5.1 網絡退化問題
學習更深的網絡的一個障礙是梯度消失/爆炸,該問題可以通過Batch Normalization 在很大程度上解決。
ResNet 論文作者發現:隨著網絡的深度的增加,準確率達到飽和之后迅速下降,而這種下降不是由過擬合引起的。這稱作網絡退化問題。
如果更深的網絡訓練誤差更大,則說明是由于優化算法引起的:越深的網絡,求解優化問題越難。如下所示:更深的網絡導致更高的訓練誤差和測試誤差。
理論上講,較深的模型不應該比和它對應的、較淺的模型更差。因為較深的模型是較淺的模型的超空間。較深的模型可以這樣得到:先構建較淺的模型,然后添加很多恒等映射的網絡層。
實際上我們的較深的模型后面添加的不是恒等映射,而是一些非線性層。因此,退化問題表明:通過多個非線性層來近似橫等映射可能是困難的。
解決網絡退化問題的方案:學習殘差。
5.2 殘差塊
假設需要學習的是映射 ,殘差塊使用堆疊的非線性層擬合殘差: 。
其中:
和 是塊的輸入和輸出向量。
是要學習的殘差映射。因為 ,因此稱 F 為殘差。
+ :通過快捷連接逐個元素相加來執行??旖葸B接 指的是那些跳過一層或者更多層的連接。
快捷連接簡單的執行恒等映射,并將其輸出添加到堆疊層的輸出。
快捷連接既不增加額外的參數,也不增加計算復雜度。
相加之后通過非線性激活函數,這可以視作對整個殘差塊添加非線性,即 。
前面給出的殘差塊隱含了一個假設: 和 的維度相等。如果它們的維度不等,則需要在快捷連接中對 執行線性投影來匹配維度: 。
事實上當它們維度相等時,也可以執行線性變換。但是實踐表明:使用恒等映射足以解決退化問題,而使用線性投影會增加參數和計算復雜度。因此 僅在匹配維度時使用。
殘差函數 F 的形式是可變的。
如果F 只有一層,則殘差塊退化線性層: 。此時對網絡并沒有什么提升。
此時 x 也是一個feature map,而不再是一個向量。
連接形式可變:不僅可用于全連接層,可也用于卷積層。此時 F 代表多個卷積層的堆疊,而最終的逐元素加法+ 在兩個feature map 上逐通道進行。
層數可變:論文中的實驗包含有兩層堆疊、三層堆疊,實際任務中也可以包含更多層的堆疊。
殘差學習成功的原因:學習殘差 比學習原始映射 要更容易。
當原始映射 H 就是一個恒等映射時,F 就是一個零映射。此時求解器只需要簡單的將堆疊的非線性連接的權重推向零即可。
實際任務中原始映射 H 可能不是一個恒等映射:
如果 H 更偏向于恒等映射(而不是更偏向于非恒等映射),則F 就是關于恒等映射的抖動,會更容易學習。
如果原始映射 H 更偏向于零映射,那么學習 H 本身要更容易。但是在實際應用中,零映射非常少見,因為它會導致輸出全為0。
如果原始映射 H 是一個非恒等映射,則可以考慮對殘差模塊使用縮放因子。如Inception-Resnet 中:在殘差模塊與快捷連接疊加之前,對殘差進行縮放。注意:ResNet?作者在隨后的論文中指出:不應該對恒等映射進行縮放。因此Inception-Resnet對殘差模塊進行縮放。
可以通過觀察殘差 F 的輸出來判斷:如果 F 的輸出均為0附近的、較小的數,則說明原始映射 H 更偏向于恒等映射;否則,說明原始映射 H 更偏向于非橫等映射。
5.3 ResNet 分析
Veit et al. 認為ResNet 工作較好的原因是:一個ResNet 網絡可以看做是一組較淺的網絡的集成模型。
但是ResNet 的作者認為這個解釋是不正確的。因為集成模型要求每個子模型是獨立訓練的,而這組較淺的網絡是共同訓練的。
論文《Residual Networks Bahave Like Ensemble of Relatively Shallow Networks》 對ResNet 進行了深入的分析。
通過分解視圖表明:ResNet 可以被視作許多路徑的集合。
通過研究ResNet 的梯度流表明:網絡訓練期間只有短路徑才會產生梯度流,深的路徑不是必須的。
通過破壞性實驗,表明:
即使這些路徑是共同訓練的,它們也不是相互依賴的。
這些路徑的行為類似集成模型,其預測準確率平滑地與有效路徑的數量有關。
5.3.1 分解視圖
考慮從輸出 到 的三個ResNet 塊構建的網絡。根據:
下圖中:左圖為原始形式,右圖為分解視圖。分解視圖中展示了數據從輸入到輸出的多條路徑。
對于嚴格順序的網絡(如VGG?),這些網絡中的輸入總是在單個路徑中從第一層直接流到最后一層。如下圖所示。
分解視圖中, 每條路徑可以通過二進制編碼向量 來索引:如果流過殘差塊 ,則 ;如果跳過殘差塊 ,則 。
因此ResNet 從輸入到輸出具有 條路徑,第 i 個殘差塊 的輸入匯聚了之前的 個殘差塊的 條路徑。
普通的前饋神經網絡也可以在單個神經元(而不是網絡層)這一粒度上運用分解視圖,這也可以將網絡分解為不同路徑的集合。
它與ResNet 分解的區別是:
普通前饋神經網絡的神經元分解視圖中,所有路徑都具有相同的長度。
ResNet 網絡的殘差塊分解視圖中,所有路徑具有不同的路徑長度。
5.3.2 路徑長度分析
ResNet 中,從輸入到輸出存在許多條不同長度的路徑。這些路徑長度的分布服從二項分布。對于 n 層深的ResNet,大多數路徑的深度為 。
下圖為一個 54 個塊的ResNet 網絡的路徑長度的分布 ,其中95% 的路徑只包含 19~35個塊。
5.3.3 路徑梯度分析
ResNet 中,路徑的梯度幅度隨著它在反向傳播中經過的殘差塊的數量呈指數減小。因此,訓練期間大多數梯度來源于更短的路徑。
對于一個包含 54 個殘差塊的ResNet 網絡:
下圖表示:單條長度為 k 的路徑在反向傳播到 input 處的梯度的幅度的均值,它刻畫了長度為 k 的單條路徑的對于更新的影響。
因為長度為 k 的路徑有多條,因此取其平均。
下圖表示:長度為 k 的所有路徑在反向傳播到 input 處的梯度的幅度的和。它刻畫了長度為 k 的所有路徑對于更新的影響。
它不僅取決于長度為 k 的單條路徑的對于更新的影響,還取決于長度為 k 的單條路徑的數量。
有效路徑:反向傳播到 input 處的梯度幅度相對較大的路徑。
ResNet 中有效路徑相對較淺,而且有效路徑數量占比較少。在一個54 個塊的ResNet 網絡中:
幾乎所有的梯度更新都來自于長度為 5~17 的路徑。
長度為 5~17 的路徑占網絡所有路徑的 0.45% 。
論文從頭開始重新訓練ResNet,同時在訓練期間只保留有效路徑,確保不使用長路徑。實驗結果表明:相比于完整模型的 6.10% 的錯誤率,這里實現了 5.96% 的錯誤率。二者沒有明顯的統計學上的差異,這表明確實只需要有效路徑。
因此,ResNet 不是讓梯度流流通整個網絡深度來解決梯度消失問題,而是引入能夠在非常深的網絡中傳輸梯度的短路徑來避免梯度消失問題。
和ResNet 原理類似,隨機深度網絡起作用有兩個原因:
訓練期間,網絡看到的路徑分布會發生變化,主要是變得更短。
訓練期間,每個mini-batch 選擇不同的短路徑的子集,這會鼓勵各路徑獨立地產生良好的結果。
5.3.4 路徑破壞性分析
在ResNet 網絡訓練完成之后,如果隨機丟棄單個殘差塊,則測試誤差基本不變。因為移除一個殘差塊時,ResNet 中路徑的數量從 減少到 ,留下了一半的路徑。
在VGG 網絡訓練完成之后,如果隨機丟棄單個塊,則測試誤差急劇上升,預測結果就跟隨機猜測差不多。因為移除一個塊時,VGG 中唯一可行的路徑被破壞。
刪除ResNet 殘差塊通常會刪除長路徑。
當刪除了 k 個殘差塊時,長度為 x 的路徑的剩余比例由下式給定: 。
下圖中:
刪除10個殘差模塊,一部分有效路徑(路徑長度為5~17)仍然被保留,模型測試性能會部分下降。
刪除20個殘差模塊,絕大部分有效路徑(路徑長度為5~17)被刪除,模型測試性能會大幅度下降。
ResNet 網絡中,路徑的集合表現出一種類似集成模型的效果。一個關鍵證據是:它們的整體表現平穩地取決于路徑的數量。隨著網絡刪除越來越多的殘差塊,網絡路徑的數量降低,測試誤差平滑地增加(而不是突變)。
如果在測試時重新排序網絡的殘差塊,這意味著交換了低層映射和高層映射。采用Kendall Tau rank 來衡量網絡結構被破壞的程度,結果表明:隨著 Kendall Tau rank 的增加,預測錯誤率也在增加。
5.4 網絡性能
plain 網絡:一些簡單網絡結構的疊加,如下圖所示。圖中給出了四種plain 網絡,它們的區別主要是網絡深度不同。其中,輸入圖片尺寸 224x224 。
ResNet 簡單的在plain 網絡上添加快捷連接來實現。
FLOPs:floating point operations 的縮寫,意思是浮點運算量,用于衡量算法/模型的復雜度。
FLOPS:floating point per second的縮寫,意思是每秒浮點運算次數,用于衡量計算速度。
相對于輸入的feature map,殘差塊的輸出feature map 尺寸可能會發生變化:
有兩種擴充方式:
直接通過 0 來填充需要擴充的維度,在圖中以實線標識。
通過1x1 卷積來擴充維度,在圖中以虛線標識。
輸出 feature map 的尺寸減半。此時需要對快捷連接執行步長為 2 的池化/卷積:如果快捷連接已經采用 1x1 卷積,則該卷積步長為2 ;否則采用步長為 2 的最大池化 。
輸出 feature map 的通道數增加,此時需要擴充快捷連接的輸出feature map 。否則快捷連接的輸出 feature map 無法和殘差塊的feature map 累加。
計算復雜度:
| 計算復雜度(FLOPs) | 19.6 billion | 3.5 billion | 3.6 billion |
模型預測能力:在ImageNet 驗證集上執行10-crop 測試的結果。
| VGG-16 | 28.07% | 9.33% |
| GoogleNet | - | 9.15% |
| PReLU-net | 24.27% | 7.38% |
| plain-34 | 28.54% | 10.02% |
| ResNet-34 A | 25.03% | 7.76% |
| ResNet-34 B | 24.52% | 7.46% |
| ResNet-34 C | 24.19% | 7.40% |
| ResNet-50 | 22.85% | 6.71% |
| ResNet-101 | 21.75% | 6.05% |
| ResNet-152 | 21.43% | 5.71% |
A 類模型:快捷連接中,所有需要擴充的維度的填充 0 。
B 類模型:快捷連接中,所有需要擴充的維度通過1x1 卷積來擴充。
C 類模型:所有快捷連接都通過1x1 卷積來執行線性變換。
可以看到C 優于B,B 優于A。但是 C 引入更多的參數,相對于這種微弱的提升,性價比較低。所以后續的ResNet 均采用 B 類模型。
本文福利
可以在?本公眾號后臺?回復關鍵詞:“?DS?”獲取大量由我平臺編輯精心整理的學習資料,如果覺得有用,?請勿吝嗇你的留言和贊哦!
——?完?——
文章作者:華校專?
責任編輯:周巖?Logic?破繭
審核編輯:阿春
微信編輯:破繭
本文由『運籌OR帷幄』原創發布
如需轉載請在公眾號后臺獲取轉載須知
原文鏈接:http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/5_CNN_1_classfication.html
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【深度学习】基础知识--CNN:图像分类(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中静态代码块的用法 static
- 下一篇: 【深度学习】真正的即插即用!盘点11种C