天天看點

Caffe實戰(十):win-caffe訓練和測試cifar10資料集

CNN訓練Cifar-10技巧這篇文章中介紹了關于cifar10訓練的一些常用技巧,可以提高訓練精度以及速度,指的借鑒:

  • 使用ReLu激活函數:ReLu為網絡引入了大量的稀疏性,加速了複雜特征解離。非飽和的寬廣映射空間,加速了特征學習;
  • 卷積層w初始化逐層增大标準差:Alex選擇了高斯分布生成零均值、小标準差的随機值作為初始化W,并且逐層加大标準差,使得W有彈性。(0.0001-0.01-0.01-0.1-0.1);
  • 學習速率:Caffe和Alex給的Model基礎都是0.001(W)/0.002(b);
  • 資料集作均值歸一化:Alex 和 Caffe中的初始化參數都是基于均值歸一化的,如果不做歸一化,會因為輸入大了一半,導緻訓練失敗;
  • 池化中采用重疊結構:Alex在paper中還提到,重疊Pooling一定程度上減輕了過拟合;不重疊忽視了鄰近像素的對特征的影響,會造成網絡精度下降;
  • 恰當使用均采樣:重疊結構在提高精度的同時,可能引入噪聲。而Alex則在Conv2、Conv3全使用了Avg Pooling;
  • 最佳效果:Max+Avg+Avg;
  • 基本沒有用的LRN層。
Caffe實戰(十):win-caffe訓練和測試cifar10資料集

擷取cifar-10資料集

Cifar-10由60000張32*32的RGB彩色圖檔構成,共10個分類。50000張訓練,10000張測試(交叉驗證)。這個資料集最大的特點在于将識别遷移到了普适物體,而且應用于多分類(姊妹資料集Cifar-100達到100類,ILSVRC比賽則是1000類)。

cifar-10資料集和cifar-100資料集的官方網址都是:https://www.cs.toronto.edu/~kriz/cifar.html

cifar-10有三種版本

CIFAR-10 python version    163 MB    c58f30108f718f92721af3b95e74349a

CIFAR-10 Matlab version    175 MB    70270af85842c9e89bb428ec9976c926

CIFAR-10 binary version (suitable for C programs)    162 MB    c32a1d4ab5d03f1284b67883e8d8753

自己使用的是二進制版本,下載下傳後解壓即可;

Caffe實戰(十):win-caffe訓練和測試cifar10資料集

batches.meta.txt:标簽内容

data_batch_1.....5.bin為訓練集,每個檔案10000張圖像;

test_batch.bin為測試集;

轉換為lmdb或leveldb格式

caffe使用lmdb或leveldb資料格式作為DataLayer的輸入形式,利用自帶的轉換資料格式工具進行轉換:

convert_cifar10.cmd檔案内容

rem 将cifar-10-binary格式轉換為lmdb
rem 參數(1)cifar-10-binary路徑,包含data_batch_1(1-5).bin 5個訓練資料(共50000),test_batch.bin測試資料(10000);
rem 參數(2)輸出lmdb格式路徑
rem 參數(3)資料格式 lmdb或leveldb
rem ..\\..\\Build\\x64\\Release\\convert_cifar_data.exe ..\\..\\data\\cifar10\\cifar-10-binary ..\\..\\data\\cifar10 lmdb
 
..\\..\\Build\\x64\\Release\\convert_cifar_data.exe ..\\..\\data\\cifar10\\cifar-10-binary ..\\..\\data\\cifar10 leveldb      

計算訓練資料集的均值

rem 計算均值
rem 參數(1)訓練資料路徑;--backend=lmdb 指的是資料格式
rem 參數(2)輸出均值檔案路徑和名稱
rem ..\\..\\Build\\x64\\Release\\compute_image_mean.exe --backend=lmdb ..\\..\\data\\cifar10\\cifar10_train_lmdb ..\\..\\data\\cifar10\\mean.binaryproto
 
..\\..\\Build\\x64\\Release\\compute_image_mean.exe --backend=leveldb ..\\..\\data\\cifar10\\cifar10_train_leveldb ..\\..\\data\\cifar10\\mean.binaryproto.leveldb      

修改求解器配置檔案以及網絡模型檔案

求解器檔案主要修改選擇CPU還是GPU模式,以及網絡模型檔案和快照輸出檔案的路徑是否正确;(注意目前工作目錄)

Caffe實戰(十):win-caffe訓練和測試cifar10資料集

網絡模型檔案中主要修改輸入層的資料來源路徑以及資料格式;

Caffe實戰(十):win-caffe訓練和測試cifar10資料集

訓練cifar10

caffe自帶的例子中提供了幾種網絡模型以及訓練參數可供參考。以訓練cifar10_quick_train_test.prototxt網絡模型為例:

rem 切換到caffe_root目錄
cd E:
cd E:\Learning\caffe\Microsoft\caffe
 
rem 訓練cifar10_quick_solver.prototxt
Build\\x64\\Release\\caffe.exe train --solver=examples\\cifar10\\cifar10_quick_solver.prototxt > examples\\cifar10\\cifar10_quick_train.log 2>&1      

訓練完成後輸出兩個檔案:xxx.caffemodel.h5為網絡權值參數檔案;xxx.solverstate.h5為網絡模型狀态檔案,用恢複網絡狀态或者在此基礎上進一步訓練。

Caffe實戰(十):win-caffe訓練和測試cifar10資料集

備注:這裡采用資料流重導向的操作,輸出到log檔案中,便于檢視訓練過程的log日志資訊。

Caffe實戰(十):win-caffe訓練和測試cifar10資料集

測試cifar10驗證集

rem 切換到caffe_root目錄
cd E:
cd E:\Learning\caffe\Microsoft\caffe
 
rem 測試cifar10_quick_solver.prototxt
Build\\x64\\Release\\caffe.exe test -model examples\\cifar10\\cifar10_quick_train_test.prototxt -weights examples\\cifar10\\cifar10_quick_iter_4000.caffemodel.h5 -iterations 100 -gpu 0 > examples\\cifar10\\cifar10_quick_test.log 2>&1      
Caffe實戰(十):win-caffe訓練和測試cifar10資料集

利用訓練好的模型(caffemodel)測試自己的圖檔

caffe自帶分類器工具-classification,用于測試輸入單張圖檔的分類結果。
rem 利用classification.exe對單圖像進行分類測試
rem 參數(1)網絡模型定義檔案
rem 參數(2)權值檔案
rem 參數(3)均值檔案
rem 參數(4)同義詞詞集檔案
rem 參數(5)輸入圖像
 
cd E:
cd E:\Learning\caffe\Microsoft\caffe
 
rem 測試cifar10_quick_solver.prototxt參數訓練結果
Build\\x64\\Release\\classification.exe examples\\cifar10\\cifar10_quick.prototxt examples\\cifar10\\cifar10_quick_iter_4000.caffemodel.h5 data\\cifar10\\mean.binaryproto data\\cifar10\\cifar-10-binary\\synset_words.txt examples\\images\\cat.jpg      

特别注意:synset_words.txt中最後一行不應有空格或回車,否則讀取的label個數為11,與輸出層個數不一緻,會報錯。

但是分類結果不正确

Caffe實戰(十):win-caffe訓練和測試cifar10資料集

參考好多網上的測試過程以及結果,發現他們使用caffe自帶的cat圖像時,分類結果是正确的,而自己測試了很多模型,包括訓練時的loss和accuracy基本上和網上的一緻,但是為何測試另外一種圖像時會不一緻??(一直懷疑是自己注釋caffe源檔案時,修改了某些内容,導緻有問題??)

從訓練的結果來看,accuracy隻有70%左右的正确率。自己又拿測試資料集中解析出的32*32圖像進行識别測試,發現有些類别識别的準确率比較高,如airplane;有些識别的準确率比較低,如cat ,dog等。而且跟圖像的光線明暗變化,背景等都有很大的關系。從這裡可以看出,對原始圖像的預處理确實很重要,否則嚴重影響模型識别的準确率。

參考:

  • 深度學習Caffe平台執行個體——CIFAR-10資料集在caffe平台上模型訓練及執行個體使用模型進行預測
  • Caffe cifar10 執行個體