1. 程式人生 > >2.【caffe-Windows】cifar例項編譯之model的生成

2.【caffe-Windows】cifar例項編譯之model的生成

準備工作

按照之前的教程,成功生成過caffe,並且編譯整個caffe.sln專案工程,在\caffe-master\Build\x64\Debug生成了一堆exe檔案,後面會使用到除了caffe.exe的另外一個exe

【PS】很多VS安裝過程中出現問題的,比如XX載入失敗,XX未找到等,請自行尋找問題,很可能是原來的VS沒解除安裝乾淨,或者VS版本缺少一些檔案等導致。正常情況下,第一次編譯只有libcaffe.lib顯示失敗,不會出現其它error

第一步

下載cifar的資料集

多一句嘴,這個資料集是彩色圖片,也即具有RGB三通道,資料儲存方式是一行為一張圖片,包含3*32*32=3072個畫素屬性,具體多少張圖片,有興趣的可以去官網看看,或者看看資料集的儲存格式:樣本數(圖片數)*3072

與訓練model無關】下面程式碼是用matlab寫的,用於顯示其中一個樣本,當然你可以用reshape函式,前面我介紹過這個函式

[html] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. image=zeros(32,32,3);  
  2. count=0;  
  3. for i=1:3  
  4.     for j=1:32  
  5.         for k=1:32  
  6.             count=count+1;  
  7.            image(j,k,i)=data(1000,count);  
  8.         end  
  9.     end  
  10. end  
  11. imshow(uint8(image))  


第二步

下載完畢以後,解壓得到資料,請核對是否與下圖一樣


按照下列路徑,在自己的caffe目錄下建立input_folder資料夾,並拷貝相應資料集


第三步

在input_folder的上一級目錄,也就是Debug目錄建立一個bat檔案(名稱隨意,我用的是convert.bat),用於轉換資料集格式,內容如下

[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. convert_cifar_data.exe  input_folder output_folders leveldb  
  2. pause  
【PS】此處的exe就是在編譯caffe.sln時候生成的,如果沒有,請在VS中修改生成模式為DEBUG,而非release



【PS】caffe-windows是caffe官方提供的caffe,與caffe-master差不多,我這裡為了從頭演示,沒有在master裡面操作,無視之即可

執行此bat檔案,會生成一個資料夾output_folders,裡面有兩個資料夾,請核對路徑以及檔案數目



第四步

計算均值,新建另一個bat檔案(本文采用mean.bat),如下圖所示,請核對路徑

[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. compute_image_mean.exe output_folders/cifar10_train_leveldb mean.binaryproto  
  2. pause  

雙擊此bat檔案,不出意外會出現下面問題:

解決方法,開啟caffe.sln,修改compute_image_mean.cpp


重新生成一下,得到新的計算均值的exe檔案【電腦編譯中。。。等待ing。。。。】

編譯完畢,重新執行bat檔案,仔細檢查debug資料夾,會發現有一個檔名為:mean.binaryproto

第五步

將debug資料夾下的mean.binaryproto以及output_folders下的兩個資料夾拷貝到caffe-windows\examples\cifar10

在caffe-windows也就是caffe-master(根據版本自行決定)資料夾下新建一個bat檔案,用於訓練模型,本文使用train.bat

[html] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. .\Build\x64\Debug\caffe.exe train --solver=examples/cifar10/cifar10_quick_solver.prototxt  
  2. pause  
在執行之前需要修改幾個檔案,此處截圖超過2M了,傳不上來,讀者自己核對路徑以及CPU訓練設定

cifar10_quick_solver.prototxt檔案:

[html] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. # reduce the learning rate after 8 epochs (4000 iters) by a factor of 10  
  2. # The train/test net protocol buffer definition  
  3. net: "examples/cifar10/cifar10_quick_train_test.prototxt"  
  4. # test_iter specifies how many forward passes the test should carry out.  
  5. # In the case of MNIST, we have test batch size 100 and 100 test iterations,  
  6. # covering the full 10,000 testing images.  
  7. test_iter: 100  
  8. # Carry out testing every 500 training iterations.  
  9. test_interval: 500  
  10. # The base learning rate, momentum and the weight decay of the network.  
  11. base_lr: 0.001  
  12. momentum: 0.9  
  13. weight_decay: 0.004  
  14. # The learning rate policy  
  15. lr_policy: "fixed"  
  16. # Display every 100 iterations  
  17. display: 100  
  18. # The maximum number of iterations  
  19. max_iter: 4000  
  20. # snapshot intermediate results  
  21. snapshot: 4000  
  22. snapshot_format: HDF5  
  23. snapshot_prefix: "examples/cifar10/cifar10_quick"  
  24. # solver mode: CPU or GPU  
  25. solver_mode: CPU  
——————————————————————————————————————————————————————————————————————————

cifar10_quick_train_test.prototxt檔案【只貼前面一部分】,需要修改的就是資料格式為leveldb,以及相關路徑,自行核對

[html] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. name: "CIFAR10_quick"  
  2. layer {  
  3.   name: "cifar"  
  4.   type: "Data"  
  5.   top: "data"  
  6.   top: "label"  
  7.   include {  
  8.     phase: TRAIN  
  9.   }  
  10.   transform_param {  
  11.     mean_file: "examples/cifar10/mean.binaryproto"  
  12.   }  
  13.   data_param {  
  14.     source: "examples/cifar10/cifar10_train_leveldb"  
  15.     batch_size: 100  
  16.     backend: LEVELDB  
  17.   }  
  18. }  
  19. layer {  
  20.   name: "cifar"  
  21.   type: "Data"  
  22.   top: "data"  
  23.   top: "label"  
  24.   include {  
  25.     phase: TEST  
  26.   }  
  27.   transform_param {  
  28.     mean_file: "examples/cifar10/mean.binaryproto"  
  29.   }  
  30.   data_param {  
  31.     source: "examples/cifar10/cifar10_test_leveldb"  
  32.     batch_size: 100  
  33.     backend: LEVELDB  
  34.   }  
  35. }  
一定要核對正確,我好像在設定新增路徑的時候多了一個空格,結果出現了下面問題


【PS】一定要細心

最後,執行train.bat時候出現如下介面,說明正在訓練


是不是感覺和網上看到的不一樣呢?網上都是各種iteration 和loss顯示在命令視窗,但是這裡出現了prefetch batch等。原因在於我們用的是debug模式下生成的caffe在訓練,如果想看到如下情形的結果,請將caffe.sln使用release模式生成(用VS2013打卡caffe.sln以後,上方中間部分的dubug改為release,然後右鍵工程,重新生成)


第六步

訓練完成,會得到如下檔案


下面是我訓練好的cifar10的model,讀者可下載,可自行訓練

cifar10_quick_iter_4000.caffemodel.h5的連結:http://pan.baidu.com/s/1o8xSqr4 密碼:ftc5

cifar10_quick_iter_4000.solverstate.h5的連結:連結:http://pan.baidu.com/s/1eRGPlNs 密碼:589n