1. 程式人生 > >tensorflow遷移學習-使用現有模型進行新專案訓練

tensorflow遷移學習-使用現有模型進行新專案訓練

怎麼在新的專案上使用已訓練過的模型,以識別花種類為例


現代的識別模型動轍有百萬的引數,從頭開始訓練需要許多標記過的訓練資料及訓練時間,遷移學習可以很方便的複用已經訓練過的模型應用到新的場景上,
以一個在ImageNet上訓練過的圖片分類模型為例,雖然不如重新訓練一個模型精度好,但是對於幾千而不是上百萬的已打標籤的訓練資料而言,它工作的很高效,
能直接在一臺沒有GPU的手提電腦上30分鐘跑完。



首先下載hub工程,tensorflow的一些訓練過的模型已經移到hub.git上了
git clone https://github.com/tensorflow/hub.git
學習的順序建議是
先Inception V3 然後再是 NASNet/PNASNet, MobileNet V1 與V2.
sudo pip3 install tensorflow_hub



製作或者準備訓練資料,這是幾種花的分類圖片
cd /opt/flower
curl -LO http://download.tensorflow.org/example_images/flower_photos.tgz
tar xzf flower_photos.tgz
把圖片都解壓到了/opt/flower/flower_photos下


要執行的是hub/examples/image_retraining/retrain.py
python hub/examples/image_retraining/retrain.py --image_dir /opt/flower/flower_photos
如果tensorflow編譯的是python3
python3 hub/examples/image_retraining/retrain.py --image_dir /opt/flower/flower_photos


要看所有引數,請用以下命令檢視
python retrain.py -h


1)這個指令碼會從網上下載模型:
會從'https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1',下載TF-Hub Module 
主要是以下幾個檔案(在/tmp/tfhub_modules目錄下)
saved_model.pb   tfhub_module.pb  variables/variables.data-00000-of-00001  variables/variables.index


2) 載入預訓練的模型,然後訓練一個新的鮮花分類模型。
預設情況下,此指令碼將執行4000個訓練步驟。每一步從訓練集隨機選擇十個影象
會有一堆如下這行的列印:
......
INFO:tensorflow:2018-05-23 12:59:03.476464: Step 3999: Train accuracy = 97.0%
INFO:tensorflow:2018-05-23 12:59:03.476647: Step 3999: Cross entropy = 0.111035
INFO:tensorflow:2018-05-23 12:59:03.662786: Step 3999: Validation accuracy = 92.0% (N=100)
這三行就是模型的準確度了,越高自然是越好
INFO:tensorflow:Initialize variable module/InceptionV3/Mixed_7c/Branch_3/Conv2d_0b_1x1/weights:0 from checkpoint b'/tmp/tfhub_modules/11d9faf945d073033780fd924b2b09ff42155763/variables/variables' with InceptionV3/Mixed_7c/Branch_3/Conv2d_0b_1x1/weights
最後是列印這三行,說明結束了
INFO:tensorflow:Restoring parameters from /tmp/_retrain_checkpoint
INFO:tensorflow:Froze 378 variables.
Converted 378 variables to const ops


這過程會生成一些檔案在 /tmp/bottleneck下
daisy  dandelion  roses  sunflowers  tulips


3)在訓練中或之後使用tensorboard檢視訓練過程的loss,命中,weight的變化
執行
tensorboard --logdir /tmp/retrain_logs
然後瀏覽器中輸入
localhost:6006
會有圖表顯示出來


3)
訓練後新的模型儲存在
/tmp/output_graph.pb
標籤在/tmp/output_labels.txt
這個模型結合了TF-Hub module與我們新加入的訓練資料,原理是更新了原來模型的最頂層,而保持其他層。


4)有了訓練出的模型,就可以拿來用了,載入模型,並輸入一張圖片,測試結果
先下載測試指令碼:
curl -LO https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py


然後執行測試指令碼載入模型進行測試:
python3 label_image.py \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--input_layer=Placeholder \
--output_layer=final_result \
--image=/opt/flower/flower_photos/daisy/21652746_cc379e0eea_m.jpg


如果是python2的請把python3改成python
輸出如下
daisy 0.9982089
sunflowers 0.0013442119
dandelion 0.00030723808
tulips 0.00010841676
roses 3.1286174e-05


如果要自己生成圖片進行訓練,可以參考下flower_photos這個圖片資料夾,每個子資料夾是一個分類,這個子資料夾名就是分類的名字,
比如rose就是玫瑰,注意要是全小寫的且只帶數字及字母.
而且每個分類至少要大於100張圖片,圖片儘量背景要各式各樣,如果背景相似會干擾到訓練,
比如過多的藍色門與黑色的門,機器可能會以藍色與黑色來做為區分。
還有提高精度的方法是,修改引數 --random_crop, --random_scale and --random_brightness
讓機器自動對樣本圖片進行裁剪,縮放,調亮度等操作,生成更多的樣本,
或者是指定引數--how_many_training_steps值修改訓練次數.
--flip_left_right則是圖片鏡面對換操作,--learning_rate修改學習率,--train_batch_size批次大小


除了上面的模型,跑另外的模型也可以用retrain.py這個指令碼,比如mobilenet
生成模型:
python retrain.py \
    --image_dir ~/flower_photos \
    --tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/1


測試模型:
python label_image.py \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--input_layer=Placeholder \
--output_layer=final_result \
--input_height=224 --input_width=224 \
--image=/opt/flower/flower_photos/daisy/21652746_cc379e0eea_m.jpg