1. 程式人生 > >Windows下mnist資料集caffemodel分類模型訓練及測試

Windows下mnist資料集caffemodel分類模型訓練及測試

1. MNIST資料集介紹

MNIST是一個手寫數字資料庫,樣本收集的是美國中學生手寫樣本,比較符合實際情況,大體上樣本是這樣的:


MNIST資料庫有以下特性:

  • 包含了60000個訓練樣本集和10000個測試樣本集;
  • 分4部分,分別是一個訓練圖片集,一個訓練標籤集,一個測試圖片集,一個測試標籤集,每個標籤的值是0~9之間的數字;
  • 原始影象歸一化大小為28*28,以二進位制形式儲存

2.  Windows+caffe框架下MNIST資料集caffemodel分類模型訓練及測試

1. 下載mnist資料

開啟之後可以看到包含紅字部分的4個下載包:

下載之後解壓,我的caffe安裝路徑是 D:\Software\Caffe\caffe-master,所以訓練資料和測試資料分別解壓到了 D:\Software\Caffe\caffe-master\data\mnist\mnist_train_lmdb 和 D:\Software\Caffe\caffe-master\data\mnist\mnist_test_lmdb:

 2. 將MNIST資料集轉換為lmdb資料檔案

caffe直接處理的資料分為兩種格式: lmdb和leveldb,兩者關係:
  • 它們都是鍵/值對嵌入式資料庫管理系統程式設計庫
  • 雖然lmdb的記憶體消耗是leveldb的1.1倍,但是lmdb的處理速度比leveldb快10%到15%,另外lmdb允許多種訓練模型同時讀取同一組資料集。
  • lmdb取代了leveldb成為了caffe預設的資料集生成格式。
 在caffe-master目錄下新建一個create_mnist.bat指令碼檔案,輸入以下內容:
.\Build\x64\Debug\convert_mnist_data.exe .\data\mnist\mnist_train_lmdb\train-images.idx3-ubyte .\data\mnist\mnist_train_lmdb\train-labels.idx1-ubyte .\examples\mnist\mnist_train_lmdb   
echo.   
.\Build\x64\Debug\convert_mnist_data.exe .\data\mnist\mnist_test_lmdb\t10k-images.idx3-ubyte   .\data\mnist\mnist_test_lmdb\t10k-labels.idx1-ubyte .\examples\mnist\mnist_test_lmdb  
pause 
雙擊執行create_mnist.bat指令碼檔案,執行結果:
上述指令包括四部分內容,第一部分指定轉換mnist資料集的.exe工具,第二部分傳入mnist訓練資料集的位置,第三部分傳入mnist訓練資料集的標籤,第四部分指定lmdb檔案的生成路徑. 注意mnist_train_lmdb和mnist_test_lmdb兩個資料夾是訓練自動生成的,如果原檔案下已經有這兩個檔案夾了,會報錯。 執行完成之後會在指定的資料夾目錄下生成mdb檔案。

3. 計算資料庫的均值檔案

均值檔案實際上就是所有訓練樣本計算出來的平均值,在目標識別領域使用caffe時,一般都有一個減去均值的操作,這樣可以提高訓練速度和識別精度。編譯後的caffe會在Debug/Release下生成計算均值檔案的工具——cmpute_image_mean.exe,caffe裡均值檔案的資料格式是binaryproto。
在caffe-master目錄下,新建一個mnist_mean.bat指令碼檔案,輸入如下內容:
.\Build\x64\Debug\compute_image_mean.exe .\examples\mnist\mnist_train_lmdb .\examples\mnist\mean.binaryproto  
pause  

雙擊執行,執行結果:
執行完成之後會在mnist目錄下生成mean.binaryproto均值檔案:

4. lenet訓練引數設定

lenet-5是一個經典的CNN網路模型,最初是在1986年設計的,主要是為了識別手寫字型和計算機列印字元,特別是在手寫字型識別領域非常成功,曾經被廣泛應用在美國銀行系統的支票手寫字型識別上。

設定lmdb檔案路徑

開啟examples\mnist資料夾下的lenet_train_test.prototxt檔案,兩處source處輸入lmdb資料夾的相對路徑:

設定lenet訓練引數

lenet訓練引數設定是在examples\minst資料夾下的lenet_solver.prototxt檔案內。基本設定有如下3個:
  • GPU or CPU: caffe中lenet的訓練引數預設是使用GPU,這裡修改為CPU;
  • 最大迭代次數: 最大迭代次數預設是10000,一般情況下最大迭代次數越大,訓練的模型越準確,訓練耗時也越長,這裡max_iter的值10000不做修改。
  • caffemodel生成路徑:訓練完成之後會生成caffemodel分類模型,預設生成路徑是在mnist根目錄,這裡修改為mnist目錄下的CaffeModel資料夾內,snapshot_prefix: "examples/mnist/CaffeModel/lenet";
3處修改的對應位置如下:

5. 執行lenet模型訓練,生成caffemodel

在caffe-master目錄下,新建一個train_mnist.bat指令碼檔案,輸入以下內容:
.\Build\x64\Debug\caffe.exe train --solver=examples/mnist/lenet_solver.prototxt  
pause

雙擊執行,開始訓練:
使用CPU,最大迭代次數10000情況下,訓練耗時約25min,訓練完成之後會輸出該模型的識別準確率和損失率:
準確率約為99%,  訓練完成後在設定的caffemodel生成路徑 examples/minist/CaffeModel資料夾下生成caffemodel模型檔案:
一共包含4個檔案:
  • lenet_iter_10000.caffemodel 和 lenet_iter_5000.caffemodel: 這兩個檔案是最終生成的caffemodel分類模型;
  • lenet_iter_10000.solverstate 和 lenet_iter_5000.solverstate : 這兩個檔案是記錄當前訓練狀態資訊檔案。在跑訓練模型的時候遇到斷電等異常情況導致訓練中斷,再次訓練的時候就不必浪費時間從頭開始訓練,只需要呼叫 .solverstate檔案,從上次訓練中斷的位置處繼續訓練即可,具體使用方法略過。

6. 使用caffemodel測試一下mnist測試資料集的分類準確率

這裡使用上一步訓練生成的caffemodel模型測試一下對mnist測試資料集的分類準確率。 在caffe-master目錄下新建一個test-mnist.bat的指令碼檔案,輸入以下內容:
.\Build\x64\Debug\caffe.exe test --model=.\examples\mnist\lenet_train_test.prototxt -weights=.\examples\mnist\CaffeModel\lenet_iter_10000.caffemodel  
pause  

程式會根據lenet_train_test.prototxt檔案裡設定的測試資料集的路徑自動載入到測試資料,雙擊執行,完成之後得到測試資料集的識別準確率,約為98.5%: