學習筆記TF032:實現Google Inception Net

来源:http://www.cnblogs.com/libinggen/archive/2017/07/28/7248101.html
-Advertisement-
Play Games

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 解決python2.7中re模塊的search使用utf8的str出問題,然後做個總結。 ...
  • * 在頁面中使用el表達式如${param.username},相當於在後臺程式(如Servlet)中調用request.getParameter("username"); * 編程中,在頁面中使用el表達式,如 ${param.username} 也可以取到ValueStack中Property ...
  • CyclicBarrier類似於CountDownLatch也是個計數器, 不同的是CyclicBarrier數的是調用了CyclicBarrier.await()進入等待的線程數, 當線程數達到了CyclicBarrier初始時規定的數目時,所有進入等待狀態的線程被喚醒並繼續。 CyclicBar... ...
  • 加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959 文件讀取 os.File 封裝了文件相關操作 type File File代表一個打開的文件對象。 func Create(name string) (file *File, err error) Create採用 ...
  • 1.電腦語言的發展 機器語言:其實就是二進位0和1,最小為00000000,最大為11111111,8位比特為1個位元組(byte),1k=1024byte,1m=1024k,1g=1024m[第一代] 彙編語言:大白話就是用對應的標識字母單詞來替換掉龐大的機器語言[第二代] 高級語言:其中還分為第 ...
  • 附新手工具: python新手工具下載鏈接:http://pan.baidu.com/s/1eS8WMR4 密碼:7eso 註冊碼:http://idea.liyang.io py和編輯器安裝教程鏈接:http://pan.baidu.com/s/1hsoCmhQ 密碼:rpru py和編輯器安裝教 ...
  • 使用函數的意義 首先必須要認識到的是函數在python使用過程中是十分重要的,對於我們經常寫代碼時發生的多次重覆的某些代碼,我們時常會使用函數來解決諸如此類問題。 這是因為函數在解決代碼重用方面具有很大的優勢,並且這些定義好的函數在面臨修改代碼時的操作也減輕了很大一部分的工作量,並且程式可讀性也很好 ...
  • MyBatis配置文件、操作sql語句(本文全是代碼,代碼中包含詳細註釋) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...