ILSVRC12 數據集下載
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t12.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_v2.tar
使用linux命令wget:
wget -cb http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
wget是linux下一個從網絡上自動下載文件的常用自由工具。它支持HTTP,HTTPS和FTP協議,可以使用HTTP代理。
-c:這個也非常常見, 可以斷點續傳, 如果不小心終止了, 可以繼續使用命令接着下載
-b:后台下載,Wget默認的是把文件下載到當前目錄。
-O:將文件下載到指定的目錄中。
-P:保存文件之前先創建指定名稱的目錄。
-t:嘗試連接次數,當Wget無法與服務器建立連接時,嘗試連接多少次。
-r:使用遞歸下載
下載完:
tar -xvf ILSVRC2012_img_test.tar -C test
tar -xvf ILSVRC2012_img_train.tar -C train
for i in *.tar ; do mkdir ${i%%.*};tar -xvf $i -C ${i%%.*}; done
i%%.就是把i中.左邊的拿出來
i%.就是把i中.右邊的拿出來
Data Preparation
./data/ilsvrc12/get_ilsvrc_aux.sh
訓練和測試的輸入是用train.txt和val.txt描述的,以文本形式列出所有文件及標簽,注意這里使用與ILSVRC工具集不同的標簽索引:按ASCII碼順序對類名進行排序,然后依次標注為0~999(注意是從0開始的),synset_words.txt中是synset(eg:n01440764)與類別名的映射。
我現在只保留了n01440764、n01443537、n01484850、n01491361、n01494475這5類。train.txt和val.txt也相應為這五類。
看一下examples/imagenet/create_imagenet.sh文件,在example/imagenet下新建一個文件夾,名為myself,把所有要用到的圖片和腳本放進去,包括create_imagenet.sh,我們在這里面修改它:
EXAMPLE=/home/meng/caffe/examples/imagenet/myself
DATA=/home/meng/caffe/examples/imagenet/myself
TOOLS=/home/meng/caffe/build/tools
TRAIN_DATA_ROOT=/home/meng/caffe/examples/imagenet/myself/train
VAL_DATA_ROOT=/home/meng/caffe/examples/imagenet/myself/val
RESIZE=true
RESIZE=true表示要在這里resize圖像大小,如果預處理時沒有做過resize這里一定要設置。GLOG_logtostderr=1是轉儲信息供人檢查的,可以忽略它。運行:
./examples/imagenet/myself/create_imagenet.sh
在myself下生成lmdb格式的圖像信息。
Compute Image Mean
模型要求從每個圖像中減去圖像均值,因此先要用tools/compute_image_mean.cpp計算均值,這個cpp同時也可以讓我們熟練掌握如何控制多個組件,例如protocol buffer,leveldb,logging。均值可以運行如下命令計算:
./examples/imagenet/myself/make_imagenet_mean.sh
運行前修改一下幾個路徑:
EXAMPLE=/home/meng/caffe/examples/imagenet/myself
DATA=/home/meng/caffe/examples/imagenet/myself
運行后在myself下生成imagenet_mean.binaryproto文件。
遇到的問題:
std::bad_alloc 的問題
這問題怎么都找不到解決方法呀,直到我看了看ilsvrc12_train_lmdb下的data和lock的大小,發現只有8kb。此時我才想可能是lmdb文件沒有創建成功。於是重新回去create_imagenet.sh。此時:
遇到問題:
meng@DL:~/caffe/examples/imagenet/myself$ ./create_imagenet.sh
Creating train lmdb...
I0326 16:07:47.444555 2317 convert_imageset.cpp:86] Shuffling data
I0326 16:07:48.057821 2317 convert_imageset.cpp:89] A total of 6500 images.
F0326 16:07:48.057941 2317 db_lmdb.cpp:13] Check failed: mkdir(source.c_str(), 0744) == 0 (-1 vs. 0) mkdir /home/meng/caffe/examples/imagenet/myself/ilsvrc12_train_lmdb failed
*** Check failure stack trace: ***
@ 0x7f66cace35cd google::LogMessage::Fail()
@ 0x7f66cace5433 google::LogMessage::SendToLog()
@ 0x7f66cace315b google::LogMessage::Flush()
@ 0x7f66cace5e1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f66cb0d0c08 caffe::db::LMDB::Open()
@ 0x403aaf main
@ 0x7f66c9c54830 __libc_start_main
@ 0x404b59 _start
@ (nil) (unknown)
Aborted (core dumped)
原來是因為ilsvrc12_train_lmdb和ilsvrc12_val_lmdb的存在造成的,刪掉。
Model Definition
caffenet 就是Krizhevsky, Sutskever, and Hinton 在 NIPS 2012 paper提出的模型(Alexnet)的一個復現。
在文件models/bvlc_reference_caffenet/train_val.prototxt(這個文件我們也把它放在myself里)里,有一些標記phase:TRAIN or phase:TEST,這允許我們在一個文件里定義兩個相似的網絡。一個網絡訓練時用,一個網絡測試時用(我覺得是val時用)。在這兩個網絡之間,只有輸入層和輸出層不同。
輸入層的不同:訓練網絡從examples/imagenet/ilsvrc12_train_leveldb取數據,並對輸入圖片隨機取鏡像;測試網絡從examples/imagenet/ilsvrc12_val_leveldb取數據,不隨機取鏡像。(這里我們全部改成在myself里取數據,在train_val.prototxt里改,注意一定要改成/home/meng下的)
輸出層的不同:兩個網絡都輸出softmax_loss層,train時,這個層用來計算損失函數和初始化反向傳播;在validation時,損失沒什么用,測試網絡還有第二輸出層:accuracy。在測試過程中,測試網絡會實例化並在測試集上測試,產生Test score #0:xxx和Test score #1:xxx。其中0代表accuracy,1代表loss。
把models/bvlc_reference_caffenet/solver.prototxt也復制到myself下,把其中的網絡模型路徑也改成我們自己的,下面是具體參數設計(根據自己的數據集做了一點修改):
net和snap不要忘記改
- 每一個batch有64(防止內存不夠)個圖像,總共是10,000次迭代
- 每200次迭代,在驗證數據上測試一次學到的網絡
- 設置初始化的學習率為0.003,每2,000次迭代后減少一次
- 信息每20次迭代會顯示一次
- 網絡訓練的動量為0.9,權重衰減為0.00015
- 對於每1,000次迭代,取一次當前狀態的快照
Training ImageNet
把train_caffenet.sh也復制進myself,修改里面的內容為:
./build/tools/caffe train --solver=examples/imagenet/myself/solver.prototxt
運行腳本:
./examples/imagenet/myself/train_caffenet.sh
如果想要深度剖析計算時間,可以把下面的命令寫到train_caffenet.sh中或直接運行:
./build/tools/caffe time –-model=examples/imagenet/myself/train_val.prototxt
結果;Test net output #0: accuracy = 0.756
Test net output #1: loss = 1.52813 (* 1 = 1.52813 loss)
Resume Training?
如果出了什么意外中斷了訓練,那真是天都要塌了,所以快照存儲了訓練的中間結果,這個設計真是人性化,當再次訓練時,就可以從快照中恢復數據了。執行下列命令,就能恢復:
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate
這里的caffenet_train_10000.solverstate就是存儲了恢復solver狀態所需的所有必要信息的快照,具體是哪個solverstate是可以自己改的。
參考博客:http://blog.csdn.net/liumaolincycle/article/details/48475479