教程:如何使用遷移學習分類坑窪圖像

教程:如何使用遷移學習分類坑窪圖像

在本教程中,我們將學習如何使用簡單、快速的開源Tensorflow和Tensorflow Hub來完成分類挑戰。

概觀

  • 圖像分類介紹
  • Tensorflow Hub的預訓練模型介紹
  • 用Tensorflow遷移學習
  • 圖像分類(Pothole)

先決條件

  • 具備豐富的Python基礎知識進行深度學習(推薦使用Anaconda分佈)。
  • 基本的Tensorflow庫知識,這用來編寫腳本。
  • 卷積神經網絡的基礎知識。

遷移學習簡介

如果你是像我一樣的強迫ML學習者,迭代模型直到達到理想的結果是非常普遍的。現在,如果您的初始模型需要10個小時才能成功訓練,並且需要更改某些超參數或執行一些數據增強,或者您決定更改所用模型的架構,這也是另一回事,比方說,第二次迭代10小時,第三次迭代10小時,所以它繼續下去。這已被證明是非常令人沮喪的。

對於ML工程師來說,另一個令人沮喪的經歷是需要有足夠的圖像數據集來訓練模型,因為如果有大量的圖像需要學習(以百萬或數千為單位),卷積神經網絡才會做出很好的工作。這是遷移學習的地方。

在實踐中,研究人員通常寧願不從頭開始訓練卷積神經網絡,特別是當遇到上述挑戰時。相反,遷移學習方法是通過使用在龐大數據集(如Inception,AlexNet,VGGNet,GoogleNet)上訓練的CNN作為初始化或作為特徵提取器來採用的。

遷移學習的一個主要方法是通過調整所需圖層的權重來微調預先訓練的CNN圖層。Yosinski等人 (2014)觀察到CNN學習的早期特徵具有更多可應用於不同任務的通用特徵,而接近CNN體系結構的層則變得侷限於輸入數據集中定義的類別的特徵,因為它接近最終的層。

對於特徵提取,包含各類分數輸出的最後一個完全連接的CNN層被去除,其餘層被視為新的期望數據集的固定特徵提取器。

Tensorflow Hub包含可用於轉換學習目的的模塊(預先訓練的模型)。

Inception v3

Google Brain團隊Convolutional Neural Network,Inception model version 3接受了來自ImageNet數據庫的大約1000個不同類別的數百萬幅圖像的訓練。該模型已經學習了廣泛的特徵表示,可以擴展到原始類別之外的新分類挑戰(1000)。我們將使用這個模型來處理我們的分類挑戰。

用Tensorflow進行坑窪圖像分類

訓練數據集

由於其目的是對具有凹坑的圖像進行分類,使用ImageNet類pothole和chuck hole。這個類別包含了大約1300張坑坑窪窪的圖片。這是正的集合,而負的集合由隨機類別的圖像組成。

訓練程序

我們創建一個包含訓練數據集文件夾和訓練代碼文件夾的文件夾。這樣,就不需要編寫任何其他代碼。

mkdir ~/training_code

cd ~/training_code

curl -LO https://github.com/tensorflow/hub/raw/r0.1/examples/image_retraining/retrain.py

要訓​​練模型,只需運行以下代碼:

python retrain.py --image_dir ~/training_data

分析

首先,該算法會遍歷文件夾中的所有圖像,並從圖像中創建bottlenecks (提取特徵向量),然後將其緩存在臨時文件夾中。這些瓶頸已經足夠讓模型對新類別進行分類。它們保存在tmp/bottleneck中。

教程:如何使用遷移學習分類坑窪圖像

在bottlenecks 形成後,真正的訓練開始了。訓練包括4000個步驟,每個步驟從訓練集中隨機抽取10個圖像,並將其bottlenecks 輸入最後一層進行分類。對於每個訓練集,輸出訓練精度、交叉熵(監測訓練進度)和驗證精度(未用於訓練的新數據)。這個訓練大約需要30分鐘,這取決於訓練數據的大小和系統的能力。

教程:如何使用遷移學習分類坑窪圖像

結果

要使用訓練好的模型分類新圖像,請使用以下代碼:

curl -LO https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py

python label_image.py \

--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \

--input_layer=Placeholder \

--output_layer=final_result \

--image=$HOME/image_folder/image_filename.jpg

在提供給模型的坑洞圖像上,給出了以下輸出:

教程:如何使用遷移學習分類坑窪圖像

為了可視化訓練過程,下面的代碼在本地主機的瀏覽器裡啟動了tensorboard:6006

tensorboard --logdir /tmp/retrain_logs

在訓練代碼中,為了取得更好的效果,你可以在文獻中對一些超參數進行調整。這些超參數是批處理大小、迭代次數、執行正則化、學習速率。建議讀者查閱文獻,尋找提高績效的有效措施。

結論

這個簡短的教程的目的是向初學者展示,在沒有太多的時間和精力的情況下,用卷積神經網絡可以實現什麼。雖然這是通過遷移學習的方式對深度學習的介紹,但我希望它能鼓勵讀者深入研究機器學習的不同技術,以獲得更好的結果。


分享到:


相關文章: