遷移學習指令全記錄
詳細的解說請從 課程主頁面 點部落格文章。 這裡只有指令沒有說明。 以下所有的 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 的錢!
關於參數設定:
- 具體簡單的範例解說 batch_size、 test_interval、 test_iter、 max_iter
- 許多人發言討論
- 小的 batch_size 收歛比較快, 且較省記憶體, 但很容易 overfit
- 如何處理 overfitting
- 訓練資料量太少、 網路太大 => 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