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