Google Inception Net,ILSVRC 2014比賽第一名。控制計算量、參數量,分類性能非常好。V1,top-5錯誤率6.67%,22層,15億次浮點運算,500萬參數(AlexNet 6000萬)。V1降低參數量目的,參數越多模型越龐大,需數據量越大,高質量數據昂貴;參數越多,耗費 ...
Google Inception Net,ILSVRC 2014比賽第一名。控制計算量、參數量,分類性能非常好。V1,top-5錯誤率6.67%,22層,15億次浮點運算,500萬參數(AlexNet 6000萬)。V1降低參數量目的,參數越多模型越龐大,需數據量越大,高質量數據昂貴;參數越多,耗費計算資源越大。模型層數更深,表達能力更強,去除最後全連接層,用全局平均池化層(圖片尺寸變1x1),參數大減,模型訓練更快,減輕過擬合(《Network in Network》論文),Inception Module提高參數利用效率,大網路中小網路。增加分支網路,NIN級聯捲積層、NLPConv層。一般,捲積層增加輸出通道數,提升表達能力,計算量增大、過擬合,每個輸出通道對應一個濾波器,同一濾波器共用參數,只能提取一類特征。NIN,輸出通道組保信息。MLPConv,普通捲積層,接1x1捲積、ReLU激活函數。
Inception Module結構,4個分支。第一分支,輸入1x1捲積。1x1捲積,跨通道組織信息,提高網路表達能力,輸出通道升維、降維。4個分支都用1x1捲積,低成本跨通道特征變換。第二分支,1x1捲積,3x3捲積,兩次特征變換。第三分支,1x1捲積,5x5捲積。第四分支,3x3最大池化,1x1捲積。1x1捲積性價比高,小計算量,特征變換、非線性化。4個分支後聚合操作合併(輸出通道數聚合)。Inception Module 包含3種不同尺寸捲積、1個最大池化,增加不同尺度適應性。網路深度、寬度高效擴充,提升準確率,不過擬合。
Inception Net,找到最優稀疏結構單元(Inception Module)。Hebbian原理,神經反射活動持續、重覆,神經元連接穩定性持久提升,兩個神經元細胞距離近,參與對方重覆、持續興奮,代謝變化成為使對方興奮細胞。一起發射神經元會連在一起(Cells that fire together,wire together),學習過程刺激使神經元間突觸強度增加。《Provable Bounds for Learning Some Deep Representations》,很大很稀疏神經網路表達數據集概率分佈,網路最佳構築方法是逐層構築。上層高度相關(correlated)節點聚類,每個小簇(cluster)連接一起。相關性高節點連接一起。
圖片數據,臨近區域數據相關性高,相鄰像素點捲積連接一起。多個捲積核,同一空間位置,不同通道捲積核輸出結果,相關性極高。稍大一點捲積(3x3、5x5),連接節點相關性高,適當用大尺寸捲積,增加多樣性(diversity)。Inception Module 4分支,不同尺寸(1x1、3x3、5x5)小型捲積,連接相關性很高節點。
Inception Module,1x1捲積比例(輸出通道數占比)最高,3x3、5x5捲積稍低。整個網路,多個Inception Module堆疊。靠後Inception Module捲積空間集中度漸降低,捕獲更大面積特征,捕捉更高階抽象特征。靠後Inception Module,3x3、5x5大面積捲積核占比(輸出通道數)更多。
Inception Net 22層,最後一層輸出,中間節點分類效果好。使用輔助分類節點(auxiliary classifiers),中間層輸出作分類,按較小權重(0.3)加到最終分類結果。相當模型融合,給網路增加反向傳播梯度信號,提供額外正則化。
Google Inception Net家族:2014年9月《Going Deeper with Convolutions》Inception V1,top-5錯誤率6.67%。2015年2月《Batch Normalization:Accelerating Deep Network Trainign by Reducing Internal Covariate》Inception V2,top-5錯誤率4.8%。2015年12月《Rethinking the Inception Architecture ofr Computer Vision》Inception V3,top-5錯誤率3.5%。2016年2月《Inception-v4,Inception-ResNet and the Impact of Residual Connections on Learning》Inception V4,top-5錯誤率3.08%。
Inception V2,用兩個3x3捲積代替5x5大卷積,降低參數量,減輕過擬合,提出Batch Normalization方法。BN,非常有效正則化方法,讓大型捲積網路訓練速度加快很多倍,收斂後分類準確率大幅提高。BN 對每個mini-batch數據內部標準化(normalization)處理,輸出規範化到N(0,1)正態分佈,減少Internal Covariate Shift(內部神經元分佈改變)。傳統深度神經網路,每層輸入分佈變化,只能用很小學習速率。每層BN 學習速率增大很多倍,迭代次數只需原來的1/14,訓練時間縮短。BN正則化作用,減少或者取消Dropout,簡化網路結構。
增大學習速率,加快學習衰減速度,適用BN規範化數據,去除Dropout,減輕L2正則,去除LRN,更徹底shuffle訓練樣本,減少數據增強過程數據光學畸變(BN訓練更快,樣本被訓練次數更少,更真實樣本對訓練有幫助)。
Inception V3,引入Factorization into small convolutions思想,較大二維捲積拆成兩個較小一維捲積,節約大量參數,加速運算,減輕過擬合,增加一層蜚線性,擴展模型表達能力。非對稱捲積結構拆分,比對稱拆分相同小捲積核效果更明顯,處理更多、更豐富空間特征,增加特征多樣性。
優化Inception Module結構,35x35,17x17,8x8。分支中使用分支,8x8結構,Network In Network In Network。V3結合微軟ResNet。
使用tf.contrib.slim輔助設計42層Inception V3 網路。
Inception V3 網路結構
類型 kernel尺寸/步長(或註釋) 輸入尺寸
捲積 3x3/2 299x299x3
捲積 3x3/1 149x149x32
捲積 3x3/1 147x147x32
池化 3x3/2 147x147x64
捲積 3x3/1 73x73x64
捲積 3x3/2 71x71x80
捲積 3x3/1 35x35x192
Inception模塊組 3個InceptionModule 35x35x288
Inception模塊組 5個InceptionModule 17x17x768
Inception模塊組 3個InceptionModule 8x8x1280
池化 8x8 8x8x2048
線性 logits 1x1x2048
Softmax 分類輸出 1x1x1000
定義簡單函數trunc_normal,產生截斷正態分佈。
定義函數inception_v3_arg_scope,生成網路常用函數預設參數,捲積激活函數、權重初始化方式、標準化器。設置L2正則weight_decay預設值0.00004,標準差stddev預設值0.1,參數batch_norm_var_collection預設值moving_vars 。
定義batch normalization參數字典,定義衰減繫數decay 0.997,epsilon 0.001,updates_collections為tf.GraphKeys.UPADTE_OPS,字典variables_collections中beta、gamma設None,moving_mean、moving_variance設batch_norm_var_collection。
slim.agr_scope,函數參數自動賦預設值。with slim.arg_scope([slim.conv2d, slim.fully_connected], weights_regularizer=slim.l2_regularizer(weight_decay)) ,對[slim.conv2d, slim.fully_connected]兩個函數參數自動賦值,參數weights_regularizer值預設設為slim.l2_regularizer(weight_decay)。不需要每次重覆設置參數,只需要修改時設置。
嵌套一個slim.arg_scope,捲積層生成函數slim.conv2d參數賦預設值,權重初始化器weights_initializer設trunc_normal(stddev),激活函數設ReLU,標準化器設slim.batch_norm,標準化器參數設batch_norm_params,返回定義好的scope。
定義函數inception_v3_base,生成Inception V3網路捲積。參數inputs 輸入圖片數據tensor,scope 函數預設參數環境。定義字典表end_points ,保存關鍵節點。slim.agr_scope,設置slim.conv2d、slim.max_pool2d、slim_avg_pool2d函數參數預設值,stride設1,padding設VALID。非Inception Module捲積層,slim.conv2d創建捲積層,第一參數輸入tensor,第二參數輸出通道數,第三參數捲積核尺寸,第四參數步長stride ,第五參數padding模式。第一卷積層輸出通道數32,捲積核尺寸3x3,步長 2,padding模式VALID。
非Inception Module捲積層,主要用3x3小捲積核。Factorization into small convolutions思想, 用兩個1維捲積模擬大尺寸2維捲積,減少參數量,增加非線性。1x1捲積,低成本跨通道特征組合。第一卷積層步長2,其餘捲積層步長1。池化層尺寸3x3、步長2重疊最大池化。網路輸入數據驚寸299x299x3,經過3個步長2層,尺寸縮小為35x35x192,空間尺寸大降低,輸出通道增加很多。一共5個捲積層,2個池化層,實現輸入圖片數據尺寸壓縮,抽象圖片特征。
三個連續Inception模塊組。
第1個Inception模塊組3個結構類似Inception Module。
第1 Inception模塊組第1個Inception Module,名稱Mixed_5b。slim.arg_scope設置所有Inception模塊組預設參數,所有捲積層、最大池化、平均池化層步長設1,padding模式設SAME。設置Inception Module variable_scope名稱Mixed_5b。4個分支,Branch_0到Branch_3。第一分支64輸出通道1x1捲積。第二分支48輸出通道1x1捲積,連接64輸出通道5x5捲積。第三分支64輸出通道1x1捲積,連接2個96輸出通道3x3捲積。第四分支3x3平均池化,連接32輸出通道1x1捲積。最後tf.concat合併4分支輸出(第三維度輸出通道合併),生成Inception Module最終輸出。所有層步長為1,padding模型SAME,圖片尺寸不縮小,維持35x35,通道數增加,4個分支通道數和64+64+96+32=256,最終輸出tensor尺寸35x35x256。
第1 Inception模塊組第2個Inception Module,名稱Mixed_5c。步長1,padding模型SAME。4個分支,第四分支最後接64輸出通道1x1捲積。輸出tensor尺寸35x35x288。
第1 Inception模塊組第3個Inception Module,名稱Mixed_5d。輸出tensor尺寸35x35x288。
第2個Inception模塊組5個Inception Module。第2到第5Inception Module結構類似。
第2 Inception模塊組第1個Inception Module,名稱Mixed_6a。3個分支。第一分支384輸出通道3x3捲積,步長2,padding模式VAILD,圖片尺寸壓縮為17x17。第二分支3層,64輸出通道1x1捲積,兩個96輸出通道3x3捲積,最後一層步長2,padding模式VAILD,分支輸出tensor尺寸17x17x96。第三分支3x3最大池化層,步長2,padding模式VAILD,分支輸出tensor尺寸17x17x256。三分支輸出通道合併,最終輸出尺寸17x17x(384+96+256)=17x17x768。第2 Inception模塊組5個Inception Module尺寸相同。
第2 Inception模塊組第2個Inception Module,名稱Mixed_6b。4個分支。第一分支192輸出通道1x1捲積。第二分支3層,第一層128輸出通道1x1捲積,第二層128輸出通道1x7捲積,第三層192輸出通道7x1捲積。Factorization into small convolutions思想,串聯1x7捲積和7x1捲積,相當合成7x7捲積,參數量大減,減輕過擬合,增加一個激活函數,增強非線性特征變換。第三分支5層,第一層128輸出通道1x1捲積,第二層128輸出通道7x1捲積,第三層128輸出通道1x7捲積,第四層128輸出通道7x1捲積,第五層192輸出通道1x7捲積。Factorization into small convolutions典範,反覆拆分7x7捲積。第四分支3x3平均池化層,連接192輸出通道1x1捲積。四分支合併,最終輸出tensor尺寸17x17x(192+192+192+192+192)=17x17x768。
第2 Inception模塊組第3個Inception Module,名稱Mixed_6c。第二分支和第三分支前幾個捲積層輸出通道數從128變為160,最終輸出通道數還是192。網路每經過一個Inception Module,即使輸出尺寸不變,特征被重新精煉一遍,豐富捲積和非線性化,提升網路性能。
第2 Inception模塊組第4個Inception Module,名稱Mixed_6d。
第2 Inception模塊組第5個Inception Module,名稱Mixed_6e。Mixed_6e存儲end_points,作Auxiliary Classifier輸助模型分類。
第3個Inception模塊組3個Inception Module。第2到第3Inception Module結構類似。
第3 Inception模塊組第1個Inception Module,名稱Mixed_7a。3個分支。第一分支2層,192輸出通道1x1捲積,連接320輸出通道3x3捲積,步長2,padding模式VAILD,圖片尺寸壓縮為8x8。第二分支4層,192輸出通道1x1捲積,192輸出通道1x7捲積,192輸出通道7x1捲積,192輸出通道3x3捲積,最後一層步長2,padding模式VAILD,分支輸出tensor尺寸8x8x192。第三分支3x3最大池化層,步長2,padding模式VAILD,池化層不改變輸出通道,分支輸出tensor尺寸8x8x768。三分支輸出通道合併,最終輸出尺寸8x8x(320+192+768)=8x8x1280。從這個Inception Module開始,輸出圖片尺寸縮小,通道數增加,tensor 總size下降。
第3 Inception模塊組第2個Inception Module,名稱Mixed_7b。4個分支。第一分支320輸出通道1x1捲積。第二分支,第一層384輸出通道1x1捲積,第二層2個分支,384輸出通道1x3捲積和384輸出通道3x1捲積,用tf.concat合併兩個分支,得到輸出tensor尺寸8x8x(384+384)=8x8x768。第三分支,第一層448輸出通道1x1捲積,第二層384輸出通道3x3捲積,第三層2個分支,384輸出通道1x3捲積和384輸出通道3x1捲積,合併得到8x8x768輸出tensor。第四分支3x3平均池化層,連接192輸出通道1x1捲積。四分支合併,最終輸出tensor尺寸8x8x(320+768+768+192)=8x8x2048。這個Inception Module,輸出通道數從1280增加到2048。
第3 Inception模塊組第3個Inception Module,名稱Mixed_7c。返回這個Inception Module結果,作inception_v3_base函數最終輸出。
Inception V3網路結構,首先5個捲積層和2個池化層交替普通結構,3個Inception模塊組,每個模塊組內包含多個結構類似Inception Module。設計Inception Net重要原則,圖片尺寸不斷縮小,從299x299通過5個步長2捲積層或池化層,縮小8x8,輸出通道數持續增加,從開始3(RGB三色)到2048。每一層捲積、池化或Inception模塊組,空間結構簡化,空間信息轉化高階抽象特征信息,空間維度轉為通道維度。每層輸出tensor總size持續下降,降低計算量。Inception Module規律,一般4個分支,第1分支1x1捲積,第2分支1x1捲積再接分解後(factorized)1xn和nx1捲積,第3分支和第2分支類似,更深,第4分支最大池化或平均池化。Inception Module,通過組合簡單特征抽象(分支1)、比較複雜特征抽象(分支2、分支3)、一個簡化結構池化層(分支4),4種不同程度特征抽象和變換來有選擇保留不同層高階特征,最大程度豐富網路表達能力。
全局平均池化、Softmax、Auxiliary Logits。函數inception_v3輸入參數,num_classes最後需要分類數量,預設1000ILSVRC比賽數據集種類數,is_training標誌是否訓練過程,訓練時Batch Normalization、Dropout才會被啟用,dropout_keep_prob訓練時Dropoutr所需保留節點比例,預設0.8。prediction_fn分類函數,預設使用slim.softmax。spatial_squeeze參數標誌輸出是否進行squeeze操作(去除維數1維度)。reuse標誌網路和Variable是否重用。scope包含函數預設參數環境,用tf.variable_scope定義網路name、reuse參數預設值,用slim.arg_scope定義Batch Normalization和Dropout的is_trainin標誌預設值。用incepiton_v3_base構築整個網路捲積,拿到最後一層輸出net和重要節點字典表end_points。
Auxiliary Logits,輔助分類節點,幫助預測分類結果。用slim.arg_scope 捲積、最大池化、平均池化設預設步長1,預設padding模式SAME。通過end_points取Mixed_6e,再接5x5平均池化,步長3,padding設VALID,輸出尺寸17x17x768變5x5x768。接128輸出通道1x1捲積和768輸出通道5x5捲積。權重初始化方式重設標準差0.01正態分佈,padding模式VALID,輸出尺寸變1x1x768。輸出變1x1x1000。用tf.squeeze函數消除輸出tensor前兩個1維度。最後輸助分類節點輸出aux_logits儲存到字典表end_points。
分類預測邏輯。Mixed_7e最後捲積層輸出8x8全局平均池化,padding模式VALID,輸出tensor尺寸變1x1x2048。接Dropout層,節點保留率dropout_keep_prob。連接輸出通道數1000的1x1捲積,激活函數、規範化函數設空。tf.squeeze去除輸出tensor維數1維度,接Softmax分類預測結果。最後返回輸出結果logits、包含輸助節點end_points。
Inception V3 網路構建完成。超參數選擇,包括層數、捲積核尺寸、池化位置、步長大小、factorization使用時機、分支設計,需要大量探索和實踐。
Inception V3運算性能測試。網路結構大,令batch_size 32。圖片尺寸299x299,用tf.random_uniform生成隨機圖片數據 input。用slim.arg_scope載入inception_v3_arg_scope(),scope包含Batch Normalization預設參數,激活函數和參數初始化方式預設值。在arg_scope,調inception_v3函數,傳入inputs,獲取logits和end_points。創建Session,初始化全部模型參數。設置測試batch數量100,用time_tensorflow_run測試Inception V3網路forward性能。
Inception V3網路,圖片面積比VGGNet 224x224大78%,forward速度比VGGNet快。2500萬參數,比Inception V1的700萬多,不到AlexNet的6000萬的一半,比VGGNet的1.4億少很多。42層,整個網路浮點計算量僅50億次,比Inception V1的15億次多,比VGGNet少。可以移植到普通伺服器提供快速響應服務,或移植到手機實時圖像識別。
Inception V3 backward性能測試,將整個網路所有參數加入參數列表,測試對全部參數求導所需時間,或直接下載ImageNet數據集,使用真實樣本訓練並評測所需時間。
Inception V3,Factorization into small convolutions很有效,可以降低參數量、減輕過擬合,增加網路非線性表達能力。捲積網路從輸入到輸出,圖片尺寸逐漸縮小,輸出通道數逐漸增加,空間結構簡化,空間信息轉化為高階抽象特征信息。Inception Module多個分支提取不同抽象程度高階特征很有效,豐富網路表達能力。
參考資料:
《TensorFlow實踐》
歡迎付費咨詢(150元每小時),我的微信:qingxingfengzi