文檔大部分都是機翻,本人英語未過四級,所以湊合看吧
構建ImageNet
本指南旨在讓您准備好根據自己的數據訓練自己的模型。如果你只是想要一個ImageNet訓練的網絡,那么注意,由於訓練需要很多電能,我們討厭全球變暖,我們在model zoo提供如下所述訓練的CaffeNet模型。
數據准備
該指南指定所有路徑並假定所有命令都從根caffe目錄執行。(即~/caffe)
通過“ImageNet”我們這里意味着ILSVRC12挑戰,但你也可以輕松地訓練整個ImageNet,只是需要更多的磁盤空間,和一個更長的訓練時間。
我們假設您已經下載了ImageNet培訓數據和驗證數據,並且它們存儲在您的磁盤上,如:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
您將首先需要准備一些輔助數據進行培訓。此數據可通過以下方式下載:(在caffe目錄下直接執行即可)
./data/ilsvrc12/get_ilsvrc_aux.sh
訓練數據和驗證數據輸入在文本中描述train.txt和val.txt列出所有文件及其標簽。注意,我們使用不同於ILSVRC devkit的標簽索引:我們按照ASCII順序對synset名稱進行排序,然后將它們從0標記到999.可以在synset_words.txt中看到 synset/name的映射關系。
您可能需要提前將圖像調整為256x256。默認情況下,我們不鼓勵這樣做,因為在集群環境中,使用mapreduce並行方式調整圖像大小獲益。例如,揚清使用他的輕量的mincepie包。如果你寧願事情更簡單,你也可以使用shell命令,如:
for name in /path/to/imagenet/val/*.JPEG; do
convert -resize 256x256\! $name $name
done
看看examples/imagenet/create_imagenet.sh。根據需要設置訓練和測試數據文件夾的路徑,並設置“RESIZE = true”將所有圖像調整為256x256,如果您沒有提前調整圖像大小現在只需使用 examples/imagenet/create_imagenet.sh創建leveldbs。請注意,examples/imagenet/ilsvrc12_train_leveldb而examples/imagenet/ilsvrc12_val_leveldb不應這種執行前就存在。它將由腳本創建。GLOG_logtostderr=1只是轉儲更多的信息供您檢查,您可以安全地忽略它。
計算圖像平均值
該模型要求我們從每個圖像中減去圖像平均值,因此我們必須計算平均值。tools/compute_image_mean.cpp實現它 - 它也是一個很好的例子,讓您熟悉如何操作多個組件,如協議緩沖區,leveldbs和日志記錄,如果你不熟悉他們。無論如何,平均計算可以用下面這個文件直接執行輸出:
./examples/imagenet/make_imagenet_mean.sh
這將創建 data/ilsvrc12/imagenet_mean.binaryproto。
模型定義
我們將描述Krizhevsky,Sutskever和Hinton在他們的NIPS 2012論文中首先提出的方法的參考實現。
網絡定義(models/bvlc_reference_caffenet/train_val.prototxt)遵循Krizhevsky et al。請注意,如果您偏離本指南中建議的文件路徑,則需要調整.prototxt文件中的相關路徑。
如果你仔細看models/bvlc_reference_caffenet/train_val.prototxt,你會注意到幾個include部分指定phase: TRAIN或phase: TEST。這些部分允許我們在一個文件中定義兩個密切相關的網絡:用於訓練的網絡和用於測試的網絡。這兩個網絡幾乎相同,共享除了用include { phase: TRAIN }或標記的那些層之外的所有層include { phase: TEST }。在這種事件下,只有輸入層和一個輸出層不同。
輸入層差異:訓練網絡的data輸入層從examples/imagenet/ilsvrc12_train_leveldb輸入圖像中提取其數據並隨機鏡像。測試網絡的data層從數據獲取數據,examples/imagenet/ilsvrc12_val_leveldb不執行隨機鏡像。
輸出層差異:兩個網絡都輸出softmax_loss層,其在訓練中用於計算損失函數和初始化反向傳播,而在驗證中這個損失被簡單報告。測試網絡還具有第二輸出層,accuracy其用於報告測試集上的精度。在訓練過程中,測試網絡偶爾會在測試集上進行實例化和測試,生成類似Test score #0: xxx和Test score #1: xxx。在這種情況下,分數0是准確度(對於未經訓練的網絡,其將從1/1000 = 0.001開始),分數1是損失(對於未訓練的網絡,其將從7開始)。
我們還將布置一個用於運行解算器的協議緩沖區。讓我們做幾個計划:
我們將以256的批次運行,並運行總共450,000次迭代(約90個周期)。
對於每1000次迭代,我們使用驗證數據測試學習網絡。
我們將初始學習速率設置為0.01,並且每100,000次迭代(大約20個周期)減少它。
每20次迭代將顯示信息。
網絡將訓練有動量0.9和0.0005的重量衰減。
對於每10,000次迭代,我們將保存當前狀態的快照。
聽起來不錯?這是在中實現的models/bvlc_reference_caffenet/solver.prototxt。
訓練ImageNet
准備好了嗎?開始訓練。
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt
坐下來享受吧!
在K40機器上,每20次迭代運行大約26.5秒(而在K20上這需要36秒),因此對於完全前向傳播-反向傳播過程,每個圖像有效地大約5.2ms。大約2毫秒是前向的,其余的是反向的。如果你有興趣剖析計算時間,你可以運行
./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt
繼續訓練?
我們都有電源斷電的經歷,或者我們獎勵自己一點通過玩戰地(有人還記得震撼?)。由於我們在訓練期間快照中間結果,我們能夠從快照中恢復。這可以做到很容易:
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate
其中在腳本中caffenet_train_iter_10000.solverstate是解算器狀態快照,其存儲用於恢復精確解算器狀態(包括參數,動量歷史等)的所有必要信息。
分詞
希望你喜歡這個方法!自ILSVRC 2012挑戰以來,許多研究人員已經走得更遠,改變了網絡架構或微調網絡中的各種參數,以滿足新的數據和任務。 Caffe讓你通過簡單地編寫不同的prototxt文件更容易探索不同的網絡選擇 - 那不是很令人興奮嗎?
現在你有一個訓練有素的網絡,看看如何使用它和Python接口分類ImageNet。
