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激活函數。git
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分支,不一樣尺寸(1x一、3x三、5x5)小型卷積,鏈接相關性很高節點。網絡
Inception Module,1x1卷積比例(輸出通道數佔比)最高,3x3、5x5卷積稍低。整個網絡,多個Inception Module堆疊。靠後Inception Module卷積空間集中度漸下降,捕獲更大面積特徵,捕捉更高階抽象特徵。靠後Inception Module,3x3、5x5大面積卷積核佔比(輸出通道數)更多。dom
Inception Net 22層,最後一層輸出,中間節點分類效果好。使用輔助分類節點(auxiliary classifiers),中間層輸出做分類,按較小權重(0.3)加到最終分類結果。至關模型融合,給網絡增長反向傳播梯度信號,提供額外正則化。ide
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