遷移學習指令全記錄

詳細的解說請從 課程主頁面 點部落格文章。 這裡只有指令沒有說明。 以下所有的 ckhung 請換成你的 floyd 帳號名稱。

一、 很犯規的 caffe 初體驗: 省略訓練直接跳到影像辨識

mkdir ~/transfer
cd ~/transfer
wget http://fs.cyut.edu.tw/ckhung/180526/code.tgz
tar xzf code.tgz
wget http://fs.cyut.edu.tw/ckhung/180526/bvlc.tgz
tar xzf bvlc.tgz
ls -l code bvlc
docker run -it --name ailab -v ~/transfer:/SH bvlc/caffe:cpu bash

以下在 docker 裡面

ls -l /SH
env | grep CAFFE
python /SH/code/cnclassify.py -h
cp $CAFFE_ROOT/examples/images/*.jpg /SH
python /SH/code/cnclassify.py --model /SH/bvlc/deploy.prototxt --weights /SH/bvlc/bvlc_reference_caffenet.caffemodel --labels /SH/code/synset_words.txt /SH/*.jpg
exit

回到 host 之後, 若想再進入 docker, 這樣下: docker start -ai ailab 。 可以從網路上抓一些圖片、 放進 ~/transfer、 在 docker 裡再次執行 cnclassify.py 測試。

二、 在本機的 docker 裡, 用 CPU 進行遷移學習

cd ~/transfer
wget http://fs.cyut.edu.tw/ckhung/180526/curated-fruit.tgz
tar xzf fruit-curated.tgz
mkdir fruit-lmdb output
ls -ltr

docker rm ailab
docker run -it --name ailab -v ~/transfer:/SH bvlc/caffe:cpu bash

以下在 docker 裡面

ls -l /SH
pip install opencv-python lmdb
cd /SH/fruit-lmdb
ls -l
python /SH/code/pic2lmdb.py -h
time python /SH/code/pic2lmdb.py /SH/code/fruit-wnid.txt /SH/fruit
ls -l
wc training/index.txt validation/index.txt

echo $CAFFE_ROOT
ls $CAFFE_ROOT/
$CAFFE_ROOT/build/tools/compute_image_mean -backend=lmdb training/ mean.binaryproto
python /SH/code/bpt2npy.py mean.binaryproto mean.npy
ls -trl

$CAFFE_ROOT/build/tools/caffe train --solver=/SH/code/solver.prototxt --weights /SH/bvlc/bvlc_reference_caffenet.caffemodel > /SH/train.log 2>&1

然後可以另開一個新的分頁, 從 host 裡面用 tail -f ~/transfer/train.log 觀察訓練進度。

三、 在 floydhub 上面, 用 GPU 進行遷移學習

cd ~/transfer/code
du -s # 確認數值不超過幾百
floyd init transfer

然後, 深呼吸... floyd run --gpu --env caffe:py2 --data ckhung/datasets/fruit-lmdb:/fruit-lmdb --data ckhung/datasets/bvlc_reference_caffenet:/bvlc 'ln -s / /SH ; perl -pe "s/CPU/GPU/" solver.prototxt > solver-gpu.prototxt ; $CAFFE_ROOT/build/tools/caffe train --solver=/code/solver-gpu.prototxt --weights /bvlc/bvlc_reference_caffenet.caffemodel'

記得適時把 job 停掉, 以免一直燒 GPU 的錢!

關於參數設定:

  1. 具體簡單的範例解說 batch_size、 test_interval、 test_iter、 max_iter
  2. 許多人發言討論
  3. 小的 batch_size 收歛比較快, 且較省記憶體, 但很容易 overfit
  4. 如何處理 overfitting
  5. 訓練資料量太少、 網路太大 => overfit。 解法: 調高 weight decay

四、 驗收成果

(在 docker 裡) 看看貓咪被判定成哪一種水果 :-) python /SH/code/cnclassify.py --model /SH/code/deploy.prototxt --weights /SH/output/fruit_iter_60.caffemodel --labels /SH/code/fruit-wnid.txt /SH/*.jpg

(在 docker 裡) 產生測試報表: time python /SH/code/cnclassify.py -f csv --model /SH/code/deploy.prototxt --weights /SH/output/fruit_iter_60.caffemodel --labels /SH/code/fruit-wnid.txt $(perl -pe 's#/fruit/#/SH/fruit/#' /SH/fruit-lmdb/validation/index.txt) > /SH/code/validation.csv

回到 host, 查看 「被判定為芭樂」 的圖片: geeqie $(grep guava validation.csv | sed 's#.* /SH/##')

統計正確率及各種誤判率: grep , validation.csv | cut -d , -f 3- | sed 's# ##g; s#/SH/fruit/##; s#-.*##' | python wnidsubst.py -w fruit-wnid.txt | python tabcc.py > stat.csv