caffe教程翻译:在caffe上训练与测试数据
本文為caffe官網(wǎng)上ImageNet教程翻譯,地址:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html
本教程旨在教我們用自己的數(shù)據(jù)訓練模型。caffe官網(wǎng)的model zoo里已經(jīng)提供了訓練好的模型。
數(shù)據(jù)準備
本教程假定所有的命令都在caffe根目錄下執(zhí)行。
這里提到的”ImageNet”是指ILSVRC2012挑戰(zhàn)賽中的數(shù)據(jù)庫,當然也可以在整個ImageNet上訓練,只是需要更大容量的硬盤和更長的時間。
現(xiàn)假定已經(jīng)下載好了ImageNet訓練數(shù)據(jù)和驗證數(shù)據(jù),它們存儲的方式如下:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
首先需要準備一些輔助數(shù)據(jù)來訓練,用如下命令下載數(shù)據(jù):
./data/ilsvrc12/get_ilsvrc_aux.sh訓練和驗證輸入作為文本文件存放在train.txt和val.txt中,同時注明標簽。注意這里所采用的標簽索引與ILSVRC工具包有所不同,這里是按ASCII碼表對類進行排序,然后標簽依次為0~999。 你可能需要先將輸入圖片剪裁為256×256大小。Yangqing使用了他的micepie包。如果你希望簡單點,也可以使用shell命令,比如:
for name in /path/to/imagenet/val/*.JPEG; doconvert -resize 256x256\! $name $name done在examples/imagenet/create_imagenet.sh文件中,按自己的需要設置訓練和驗證目錄,如果事先沒有剪裁圖片可通過設置RESIZE=true來將圖片切割為256×256大小。現(xiàn)在,便可以用examples/imagenet/create_imagenet.sh來創(chuàng)建leveldbs格式的數(shù)據(jù)庫了。注意,
examples/imagenet/ilsvrc12_train_leveldb和examples/imagenet/ilsvrc12_val_leveldb在執(zhí)行前是不能存在的,因為它們將通過腳本自動生成。GLOG_logtostderr=1是用來檢查的轉儲信息,可忽略。
計算圖像均值
模型需要從每張圖像中減去圖像均值,因此我們需要首先計算均值。 tools/compute_image_mean.cpp文件是一個非常好的例子使我們熟悉并使用眾多組件,如proto buffer,leveldbs以及l(fā)ogging。計算圖像均值可使用如下命令:
./examples/imagenet/make_imagenet_mean.sh執(zhí)行后將生成data/ilsvrc12/imagenet_mean.binaryproto文件。
模型定義
下面要介紹由Krizhevsky, Sutskever, 和Hinton三人在NIPS 2012 paper上的模型。
網(wǎng)絡定義(models/bvlc_reference_caffenet/train_val.prototxt) 遵從AlexNet網(wǎng)絡。注意如果想更改文件路徑,那么必須和.prototxt文件中的路徑相一致。
如果你仔細看過了models/bvlc_reference_caffenet/train_val.prototxt文件,將注意到在多個include部分有{phase:TRAIN}或{phase:TEST}。這些使得我們可以在同一個文件中定義該網(wǎng)絡是用來訓練或用來測試。這兩個網(wǎng)絡幾乎完全一樣,除了標有{phase:TRAIN}或{phase:TEST}的層不一樣以外,其余的層完全一致。在這種情況下,只有輸入層和輸出層不同。
輸入層區(qū)別:訓練網(wǎng)絡的data輸入層從examples/imagenet/ilsvrc12_train_leveldb下載數(shù)據(jù),并對隨機對圖像取鏡像。測試網(wǎng)絡的data輸入層從examples/imagenet/ilsvrc12_val_leveldb下載數(shù)據(jù),不對圖像取鏡像。
輸出層區(qū)別:兩個網(wǎng)絡的輸出層都是sofxmax_loss層,在訓練中該層用來計算損失函數(shù)來初始化反向傳播,在驗證過程中僅將該損失值打印出來。在測試網(wǎng)絡中同時還有第二個輸出層:accuracy,該層用來顯示在測試集上的準確率。在訓練過程中,測試網(wǎng)絡偶爾會在測試集上進行測試,產(chǎn)生兩行類似Test score #0: xxx和Test score #1: xxx這樣的輸出。在這里,score 0是準確率(對于未經(jīng)訓練的網(wǎng)絡該值約從1/1000=0.001開始),score 1是損失值(對于未經(jīng)訓練的網(wǎng)絡該值約從7開始)。
solver文件中的參數(shù)配置參考如下:
- batch大小設為256,總共450,000次迭代;
- 每1,000次迭代,在驗證數(shù)據(jù)上測試一次學習網(wǎng)絡;
- 學習率初始值為0.01,每100,000次迭代遞減;
- 每20次迭代打印一次信息;
- momentum初始值為0.9,權重遞減值為0.0005;
- 每10,000次迭代,對當前信息取一次快照
這些參數(shù)均在models/bvlc_reference_caffenet/solver.prototxt文件中聲明。
訓練網(wǎng)絡
執(zhí)行如下命令開始訓練網(wǎng)絡:
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt在K40機器上,每20次迭代大約花費26.5s(在K20上花費36s),因此對于一個完全的前-后向傳播,每張圖片需要消耗5.2s,其中2s用來前向傳播,其余時間用來后向傳播。如果想仔細了解計算時間,可執(zhí)行命令:
./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt恢復訓練
由于之前我們及時的存儲了訓練過程中的相關進度,所以可以利用snapshots恢復訓練,修改文件如下:
./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腳本中存儲了所有需要的信息(包括參數(shù)、momentum歷史值等等)。
總結
以上是生活随笔為你收集整理的caffe教程翻译:在caffe上训练与测试数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10038 mysql,关于MySql
- 下一篇: mybatis没有导入sqlsessio