1. 程式人生 > >Tensorflow MobileNet移動端遷移學習指南

Tensorflow MobileNet移動端遷移學習指南

1。介紹

TensorFlow是用於數值計算的開源庫,專門用於機器學習應用程式。筆者: csdn -固本培元  交流郵箱: [email protected]  微信:leoluopy 。  本文機器翻譯加人工矯正,可能有翻譯不當之處,歡迎討論,相互學習。 外文原文:https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/index.html#0

你會做些什麼

在這個codelab中,您將學習如何在單臺機器上執行TensorFlow,並且將訓練一個簡單的分類器來對花朵影象進行分類。

圖片由Retinafunk CC-BY

daisy (score = 0.99071)
sunflowers (score = 0.00595)
dandelion (score = 0.00252)
roses (score = 0.00049)
tulips (score = 0.00032)

我們將使用轉移學習,這意味著我們從一個已經接受另一個問題培訓的模型開始。然後,我們將對其進行再培訓,解決類似的問題。從頭開始深入學習可能需要數天時間,但轉移學習可以在短時間內完成。

我們將使用在ImageNet大型視覺識別挑戰資料集上訓練的模型。這些模型可以區分達爾馬提亞或洗碗機等1,000個不同的類別。您將可以選擇模型架構,因此您可以確定問題的速度,大小和準確性之間的正確權衡。

我們將使用這個相同的模型,但重新訓練它以基於我們自己的例子分解少數類。

你會學到什麼

  • 如何使用Python和TensorFlow來訓練影象分類器
  • 如何使用訓練出的分類器對影象進行分類

你需要什麼

  • 對Linux命令的基本瞭解

2。建立

安裝TensorFlow

如果您已經安裝了TensorFlow,請確保它是最新版本。這個codelab至少需要1.2版本。您可以使用升級到最新的穩定分支

> pip安裝 - 升級tensorflow

克隆git儲存庫

此程式碼中使用的所有程式碼都包含在此git儲存庫中。克隆儲存庫並將其放入CD中。這是我們將要工作的地方。

git clone https://github.com/googlecodelabs/tensorflow-for-poets-2

cd tensorflow-for-poets-2

3。下載訓練影象(若是自己的圖片,注意batchsize不能大於單種類圖片數量)

在開始任何培訓之前,您需要一組影象來教授模型有關您想要識別的新課程。我們建立了一個創意共享許可花卉照片的檔案,以供初次使用。通過呼叫以下兩個命令下載照片(218 MB):

curl http://download.tensorflow.org/example_images/flower_photos.tgz \
    | tar xz -C tf_files

您現在應該在工作目錄中擁有花卉照片的副本。通過發出以下命令來確認工作目錄的內容:

ls tf_files / flower_photos

上述命令應顯示以下物件:

daisy/
dandelion/
roses/
sunflowers/
tulip/
LICENSE.txt

4。遷移學習

配置你的MobileNet

再培訓指令碼可以重新訓練Inception V3模型MobileNet。在這個練習中,我們將使用MobileNet。主要區別在於Inception V3針對精確性進行了優化,而MobileNet則以一些精確度為代價進行了優化,使其體積小巧高效。

Inception V3在ImageNet上的首選精度為78%,但是大小為85MB,需要比即使是最大的MobileNet配置高出許多倍,處理精度達到70.5%,只需下載19MB。

選擇以下配置選項:

  • 輸入影象解析度:128,160,192或224px。毫不奇怪,攝入更高解析度的影象需要更多的處理時間,但會導致更好的分類準確性。我們推薦使用224作為初始設定。
  • 模型的相對大小作為最大的MobileNet的一小部分:1.0,0.75,0.50或0.25。我們推薦0.5作為初始設定。較小的模型執行速度明顯更快,但要以準確性為代價。

使用推薦的設定,通常只需幾分鐘即可在膝上型電腦上進行再培訓。您將在Linux shell變數中傳遞設定。設定這些shell變數如下:

IMAGE_SIZE=224
ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}"

下圖顯示了這些配置的首選精度(y軸),所需的計算次數(x軸)以及模型的大小(圓形區域)。

移動網顯示16點。對於4個模型尺寸(圖中的圓圈區域),每個影象解析度設定都有一個點。128px影象大小模型由每個集合中的左下角點表示,而224px模型位於右上角。

其他值得注意的體系結構也包含在內供參考。本圖中的“GoogleNet”是本表中的“Inception V1”

啟動TensorBoard

在開始訓練之前,tensorboard在後臺啟動。TensorBoard是一種包含在tensorflow中的監測和檢測工具。您將使用它來監控訓練進度。

tensorboard --logdir tf_files/training_summaries &

如果您已經有一個tensorboard正在執行,那麼該命令將失敗,並顯示以下錯誤:

ERROR:tensorflow:TensorBoard attempted to bind to port 6006, but it was already in use

您可以用以下命令殺死所有現有的TensorBoard例項:

pkill -f "tensorboard"

執行遷移學習指令碼

遷移學習指令碼是tensorflow 倉庫一部分,但不作為pip軟體包的一部分進行安裝。所以為了簡單起見,我將它包含在codelab儲存庫中。您可以使用python命令執行指令碼。花一點時間瀏覽一下“幫助”。

python -m scripts.retrain -h

執行訓練

正如引言中所述,Imagenet模型是具有數百萬引數的網路,可以區分大量的類。我們只訓練該網路的最後一層,因此訓練將在合理的時間內結束。

用一個大命令開始你的再訓練(注意--summaries_dir選項,傳送訓練進度報告到tensorboard正在監測的目錄):

python -m scripts.retrain \
  --bottleneck_dir=tf_files/bottlenecks \
  --how_many_training_steps=500 \
  --model_dir=tf_files/models/ \
  --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}"\
  --output_graph=tf_files/retrained_graph.pb \
  --output_labels=tf_files/retrained_labels.txt \
  --architecture="${ARCHITECTURE}" \
  --image_dir=/mnt/hgfs/E/recipeRes/prelabeled/
IMAGE_SIZE=224 
ARCHITECTURE="mobilenet_1.0_${IMAGE_SIZE}"
python -m scripts.retrain \
  --bottleneck_dir=tf_files/bottlenecks_rec\
  --how_many_training_steps=500\
  --model_dir=tf_files/models/\
  --summaries_dir=tf_files/training_summaries_rec/"${ARCHITECTURE}"\
  --output_graph=tf_files/retrained_graph_rec.pb\
  --output_labels=tf_files/retrained_labels_rec.txt\
  --architecture="${ARCHITECTURE}"\
  --image_dir=/mnt/hgfs/E/result/

該指令碼下載預先訓練好的模型,新增一個新的最終圖層,並在您下載的花卉照片上訓練該圖層。 

如果您使用的是Docker,並且上述命令無法報告:

ERRO[XXXX] error getting events from daemon: EOF

你可能遇到過這個錯誤。將Docker cpu分配增加到4個或更多,在OSX上,您可以通過從Docker選單中選擇“Preferences ...”來設定此設定,該設定位於“高階”選項卡上。

ImageNet不包括我們在這裡培訓的任何這些花卉物種。但是,使ImageNet可以區分1,000個類別的資訊種類對區分其他物件也很有用。通過使用這個預先訓練的網路,我們將這些資訊用作最終分類層的輸入,以區分我們的花類。

可選專案:指定訓練epoch 迭代

第一個重新訓練命令只重複500次。通過訓練更長時間,您很可能會獲得更好的結果(即更高的準確性)。要獲得此改進,請移除引數--how_many_training_steps以使用預設的4,000次迭代。

python -m scripts.retrain \
  --bottleneck_dir=tf_files/bottlenecks \
  --model_dir=tf_files/models/ \
  --summaries_dir=tf_files/training_summaries/“${ARCHITECTURE}”\ 
  --output_graph=tf_files/retrained_graph.pb \ 
  --output_labels=tf_files/retrained_labels.txt \
  --architecture="${ARCHITECTURE}" \ 
  --image_dir=tf_files/flower_photos 

更多關於瓶頸層

本部分和下一部分提供了有關遷移訓練過程如何工作的背景知識。

第一階段分析磁碟上的所有影象並計算每個影象的瓶頸值。什麼是瓶頸層?

這些ImageNet模型由多個層疊在一起組成,TensorBoard的Inception V3的簡化圖片如上所示。這些圖層是預先訓練好的,對於查詢和總結有助於對大多數影象進行分類的資訊已經非常有價值。對於這個codelab,你只訓練最後一層(final_training_ops在下圖中)。儘管之前的所有圖層都保留了他們已經訓練好的狀態。

在上圖中,左側標記為“softmax”的節點是原始模型的輸出層。而“softmax”右側的所有節點都是由再培訓指令碼新增的。

上圖是張量板的截圖。您可以在瀏覽器中開啟TensorBoard,以更好地觀察它。您可以在“圖表”選項卡中找到它。

請注意,這隻會在遷移學習指令碼完成生成“瓶頸層”檔案後才起作用。

一個瓶頸層是一個非正式的術語,我們只是實際執行分類的最終輸出層之前經常使用的層。“Bottelneck”不是用來暗示該層正在放慢網路。我們使用術語瓶頸,因為在輸出附近,表示比網路的主體更緊湊。

在訓練過程中,每個影象都會重複使用多次。計算每個影象瓶頸背後的圖層需要花費大量的時間。由於網路的這些較低層沒有被修改,它們的輸出可以被快取和重用。

所以指令碼執行網路的不變部分,Bottlene...上面標記的節點下面的所有內容,並快取結果。

您執行的命令將這些檔案儲存到bottlenecks/目錄中。如果你重新執行指令碼,它們將被重用,所以你不必再等待這部分。

更多關於訓練

一旦指令碼完成生成所有瓶頸層檔案,網路的最後一層的實際培訓就開始了。

通過將每個影象的快取值提供給瓶頸層,訓練可以高效執行。每個影象的真實標籤也被輸入到標有節點的節點中。GroundTruth.只需這兩個輸入就足以計算分類概率,訓練更新和各種效能指標。

在訓練時,您會看到一系列步驟輸出,每個輸出都顯示訓練準確性,驗證準確性和交叉熵:

  • 該訓練精度顯示了標有正確的類,目前的培訓一批使用的影象的百分比。
  • 驗證準確性:驗證準確性是從不同集合隨機選擇的一組影象中的精確度(正確標記影象的百分比)。
  • 交叉熵是一種損失函式,可以窺見學習過程的進展情況(此處的數字越低越好)。

下圖顯示了模型精度和交叉熵在訓練過程中的進展情況。如果您的模型已經完成了瓶頸檔案的生成,您可以開啟TensorBoard檢查模型的進度 ,然後單擊圖的名稱以顯示它們。TensorBoard可能會向您的命令列輸出警告。這些可以安全地被忽略。

衡量網路效能的一個真正指標就是衡量一個不在訓練資料中的資料集的效能。該效能是使用驗證準確度來衡量的。如果訓練準確度高但驗證準確度仍然很低,那意味著網路過度擬合,並且網路正在記憶訓練影象中的特定特徵,這不利於更一般地對影象進行分類。

培訓的目標是使交叉熵儘可能小,因此您可以通過關注損失是否持續下降趨勢來判斷學習是否奏效,而忽略短期噪音。

預設情況下,此指令碼執行4,000個訓練步驟。每個步驟從訓練集中隨機選擇10幅影象,從快取記憶體中找到它們的瓶頸,並將它們饋送到最終圖層以獲得預測結果。然後將這些預測與實際標籤進行比較,以通過反向傳播過程更新最終圖層的權重。

隨著過程的繼續,您應該看到報告的準確性提高。在所有訓練步驟完成後,該指令碼對與訓練和驗證圖片分開儲存的一組影象進行最終測試精度評估。該測試評估提供了訓練模型如何在分類任務上執行的最佳估計。

您應該看到85%到99%之間的準確度值,但由於訓練過程中存在隨機性,所以準確值會因執行而異。(如果您只在兩個分類進行訓練,則應該期望更高的準確性。)此數值表示測試集中影象在模型完全訓練後獲得正確標籤的百分比。

5。使用遷移訓練模型

遷移訓練指令碼將資料寫入以下兩個檔案:

  • tf_files/retrained_graph.pb,其中包含所選網路的一個版本,並在您的類別上重新培訓最後一層。
  • tf_files/retrained_labels.txt,這是一個包含標籤的文字檔案。

分類影象

codelab repo還包含tensorflow的label_image.py示例的副本,您可以使用它來測試您的網路。花一點時間閱讀此指令碼的幫助:

python -m scripts.label_image -h

正如你所看到的,這個Python程式需要很多引數。預設設定都是為這個專案設定的,但是如果您使用的MobileNet架構的影象大小不同,您需要--input_size使用您之前建立的變數來設定引數:--input_size = $ {IMAGE_SIZE}。

現在,讓我們在雛菊的這個影象上執行指令碼:

flower_photos/daisy/21652746_cc379e0eea_m.jpg

圖片由Retinafunk CC-BY

python -m scripts.label_image \
    --graph=tf_files/retrained_graph.pb \
    --image=tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg

每次執行都會打印出花標的列表,在大多數情況下,正確的花在上面(儘管每個再培訓的模型可能略有不同)。

你可能會得到這樣的雛菊照片的結果:

daisy (score = 0.99071)
sunflowers (score = 0.00595)
dandelion (score = 0.00252)
roses (score = 0.00049)
tulips (score = 0.00032)

這表明影象是菊花的高信度(〜99%),並且對於任何其他標籤具有低置信度。

您可以使用label_image.py來分類您選擇的任何影象檔案,無論是從下載的集合還是新的。您只需將--image檔名引數更改指向指令碼。

flower_photos/roses/2414954629_3708a1a04d.jpg

Image由Lori Branham提供的CC-BY

python -m scripts.label_image \ 
    --graph = tf_files/retrained_graph.pb \ 
    --image = tf_files/flower_photos/roses/2414954629_3708a1a04d.jpg

6。可選步驟:嘗試其他超引數

遷移訓練指令碼還有其他幾個可用的命令列選項。

您可以在再培訓指令碼的幫助中閱讀這些選項:

python -m scripts.retrain -h

嘗試調整其中的一些選項,以檢視是否可以提高最終驗證的準確性。

例如,該--learning_rate引數控制訓練期間最後一層更新的大小。到目前為止,我們已經放棄了它,所以程式使用了預設的learning_rate值0.01。如果您指定一個小的learning_rate,如0.005,則訓練將花費更長時間,但整體精度可能會增加。learning_rate的較高值(如1.0)可以訓練得更快,但通常會降低精度,甚至會使訓練不穩定。

你需要仔細試驗,看看你的情況是什麼。

如果你給每個實驗一個獨立不一樣的名字,這對於這種型別的工作非常有用,所以它們在TensorBoard中顯示為單獨的條目,不會相互干擾影響。

--summaries_dir是控制tensorboard中名稱的選項。之前我們使用過:

--summaries_dir=training_summaries/basic

TensorBoard監視training_summaries目錄的內容,因此設定--summarys_dirtraining_summaries或任何子目錄都training_summaries可以工作。

您可能需要一起設定以下兩個選項,以便您的結果清晰地標定:

--learning_rate=0.5
--summaries_dir=training_summaries/LR_0.5

7。可選步驟:根據您自己的資料集進行訓練

看到指令碼處理花影象後,您可以開始使用不同資料集訓練網路,以識別不同的類別。

從理論上講,你需要做的就是執行該工具,指定一組特定的子資料夾。每個子資料夾都按照您的某個類別命名,並僅包含該類別的影象。

如果您完成此步驟並傳遞子目錄的根資料夾作為引數的--image_dir引數,那麼指令碼應該訓練您提供的影象,就像它為花一樣。

分類指令碼使用資料夾名稱作為標籤名稱,每個資料夾內的影象應該是與該標籤相對應的圖片,如花卉檔案中所示:

儘可能收集每個標籤的儘可能多的圖片,並嘗試一下!

Yufeng Guo使用這些技術來製作他的糖果分揀機演示。他使用的一個快捷方式是使用ffmpeg將訓練影象從每個類別的物件視訊中分離出來。

8。下一步

恭喜,您邁出了深入學習的更大的世界!

您可以在TensorFlow網站或TensorFlow Github專案中看到更多關於使用TensorFlow的資訊。TensorFlow還有許多其他資源,包括討論組白皮書

如果你製作了一個你想在生產環境中執行的訓練模型,你還應該看看TensorFlow Serving,一個開源專案,它可以更容易地管理TensorFlow專案。

如果您有興趣在移動裝置上執行TensorFlow,請嘗試本教程的第二部分,該教程將向您展示如何優化您的模型以在Android上執行。

這個codelab是基於Pete Warden的詩人TensorFlow部落格文章和這個再培訓教程

翻譯: csdn -固本培元 [email protected]  微信:leoluopy

相關推薦

Tensorflow MobileNet移動遷移學習指南

1。介紹 TensorFlow是用於數值計算的開源庫,專門用於機器學習應用程式。筆者: csdn -固本培元  交流郵箱: [email protected]  微信:leoluopy 。  本文機器翻譯加人工矯正,可能有翻譯不當之處,歡迎討論,相互學習。

Facebook開源移動深度學習加速框架,比TensorFlow Lite快一倍

方栗子 發自 凹非寺量子位 出品 | 公眾號 QbitAIFacebook釋出了一個開源框架,叫

動態分配多工資源的移動深度學習框架

與雲相比,移動系統受計算資源限制。然而眾所周知,深度學習模型需要大量資源 。為使裝置端深度學習成為可能,應用程式開發者常用的技術之一是壓縮深度學習模型以降低其資源需求,但準確率會有所損失。儘管該技術非常受歡迎,而且已被用於開發最先進的移動深度學習系統,但它有一個重大缺陷:由於應用程式開發者獨立開發自己的應

移動深度學習框架小結

1. 起因 昨天看到小米開源了深度學習框架MACE(https://github.com/XiaoMi/mace)  看到它有幾個特點:異構加速、彙編級優化、支援各種框架的模型轉換。 整體來看,料很足,特別是異構的支援,非常有誠意。  有了異構,就可以在CPU、GPU和DSP

支援移動深度學習的幾種開源框架

原文:http://blog.csdn.net/zchang81/article/details/74280019 支援移動端深度學習的幾種開源框架   1、Caffe的移動端專案 caffe專案連線如下: android-lib android-demo

機器學習筆記(二十一):TensorFlow實戰十三(遷移學習

1 - 引言 越複雜的神經網路,需要的訓練集越大,ImageNet影象分類資料集有120萬標註圖片,所以才能將152層的ResNet的模型訓練到大約96.%的正確率。但是在真正的應用中,很難收集到如此多的標註資料。即使收集到也需要花費大量人力物力來標註。並且即使有了大量的資料集,要訓練一

協作移動開發-學習整理

需求①:向上滑動時,將tab固定到頂部 參考博文:https://blog.csdn.net/liu__520/article/details/53676834 Version 1.0 po點程式碼出來,並不是完整的安,效果來說不是很好,後期優化再加動畫吧: constructo

常用移動深度學習框架

一、常用移動端深度學習框架 深度學習發展很快,最近又出現了幾個新的移動端前向框架,例如Tengine和 TVM. 我們還沒有對這兩個框架進行深入研究,但是在對應的wiki中,可以看到這兩個框架的速度對於現有框架都具有一定優勢,通過短暫的瞭解,Tengine還是很不錯的,支援op跟模型種類

百度開源移動深度學習框架mobile-deep-learning

2017 年 9 月 25 日,百度在 GitHub 開源了移動端深度學習框架 mobile-deep-learning(MDL)的全部程式碼以及指令碼,希望這個專案在社群的帶動下能夠更好地發展。 寫在前面 深度學習技術已經在網際網路的諸多方向產生影響,每天科技

機器學習與計算機視覺(移動深度學習優化框架)

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】       我們利用tensorflow、keras、caffe或者mxnet訓練好的模型總要移植到嵌入式裝置上去執行,因此需要特定的深度學習優化框架。這

H5移動開發學習總結

對於移動端開發而言,為了做到頁面高清的效果,視覺稿的規範往往會遵循以下兩點: 1.首先,選取一款手機的螢幕寬高作為基準(現在一般選取iphone6的375×667)。之前專案中也用到過iphone5的320×568。 2.對於retina螢幕(如: dpr=

學習Vue.js之vue移動框架到底哪家強

outer import ati 工作 需要 全部 ctu ron 上層 官網:https://cn.vuejs.org/ Weex 2016年4月21日,阿裏巴巴在Qcon大會上宣布跨平臺移動開發工具Weex開放內測邀請。 Weex 是一套簡單易用的跨平臺開發方案

TensorFlow遷移學習_他山之石,可以攻玉

不同 target lis 理解 pla 之前 photo 多說 esc 目的: 使用google已經訓練好的模型,將最後的全連接層修改為我們自己的全連接層,將原有的1000分類分類器修改為我們自己的5分類分類器,利用原有模型的特征提取能力實現我們自己數據對應模型的快速訓練

移動學習筆記(一)

標簽設置 裏的 none trait 關於 http width 面具 屏幕 <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=.5,minimum-s

vue移動Ui組件 mint-ui 使用指南

home 函數 下拉加載 使用指南 otto 組件 adt div 沒有 1、上啦加載下拉刷新的使用 this.$refs.loadmore.onTopLoaded(); this.$refs.loadmore.onBottomLoaded(); 上啦刷新下拉加載的 動

eChars移動自適應學習筆記

位置 16px out 其中 內部 pri base cal print 有時會出現一個圖表需要同時在PC、移動端上展現的場景。這需要 ECharts 內部組件隨著容器尺寸變化而變化的能力。為了解決這個問題,ECharts 完善了組件的定位設置,並且實現了類似 CSS Me

TensorFlow遷移學習_他山之石,可以攻玉_V2

tsl jpeg 西遊記 snr lib 成了 exist ads 感覺 『TensorFlow』遷移學習_他山之石,可以攻玉 絮絮叨叨 開學以來課業繁重(雖然也不怎麽認真聽講...)一直沒怎麽閑著,一直沒寫什麽長的代碼,正巧好幾件事趕在一塊了:導師催著我把超新星檢測的神經

tensorflow實現遷移學習

解壓 optimize pool ini ble rate http soft 包含 此例程出自《TensorFlow實戰Google深度學習框架》6.5.2小節 卷積神經網絡遷移學習。 數據集來自http://download.tensorflow.org/example

移動布局註意事項學習之一

detection -s sed self listener oid 函數 spa 單詞 0、winphone系統a、input標簽被點擊時產生的半透明灰色背景怎麽去掉 <meta name="msapplication-tap-highlight" content

移動學習筆記(小強測試品牌學員作品)

提示 同學 ID 示例 In 針對 邏輯 release 測試經驗 4月份進入了一家教育APP的公司,該公司全部精力都投放在移動端。對於我而言是個不小的挑戰,之前雖然也有移動端的測試經驗,但是對於全部是移動端的項目還是捉襟見肘的。現在用這篇長文記錄我在移動端的工作心得。移動