標籤:輕量 鏡像 python 情況 pre 擷取資料 tool 完全 jpeg
文檔大部分都是機翻,本人英語未過四級,所以湊合看吧
構建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。
Caffe ImageNet官方文檔中文版