學習筆記TF032:實現Google Inception Net

來源:互聯網
上載者:User

標籤:padding   lex   重疊   run   輸入   抽象   tin   一點   實踐   

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少。可以移植到普通伺服器提供快速響應服務,或移植到手機即時Image Recognition。

Inception V3 backward效能測試,將整個網路所有參數加入參數列表,測試對全部參數求導所需時間,或直接下載ImageNet資料集,使用真實樣本訓練並評測所需時間。

Inception V3,Factorization into small convolutions很有效,可以降低參數量、減輕過擬合,增加網路非線性表達能力。卷積網路從輸入到輸出,圖片尺寸逐漸縮小,輸出通道數逐漸增加,空間結構簡化,空間資訊轉化為高階抽象特徵資訊。Inception Module多個分支提取不同抽象程度高階特徵很有效,豐富網路表達能力。

 

參考資料:
《TensorFlow實踐》

歡迎付費諮詢(150元每小時),我的:qingxingfengzi

學習筆記TF032:實現Google Inception Net

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.