1. 程式人生 > >利用mnist訓練集生成的caffemodel對mnist測試集與自己手寫的數字進行測試

利用mnist訓練集生成的caffemodel對mnist測試集與自己手寫的數字進行測試

從一到二:利用mnist訓練集生成的caffemodelmnist測試集與自己手寫的數字進行測試

通過從零到一的教程,我們已經得到了通過mnist訓練集生成的caffemodel,主要包含下面四個檔案:

 

      接下來就可以利用模型進行測試了。關於測試方法按照上篇教程還是選擇bat檔案,當然python、matlab更為方便,比如可以迅速把識別錯誤的圖片顯示出來。

一、均值檔案mean.binaryproto

    在進行分類之前首先需要產生所有圖片的平均值圖片,真正分類時的每個圖片都會先減去這張平均值圖片再進行分類。這樣的處理方式能夠提升分類的準確率。

   產生均值檔案的方法是利用解決方案中的compute_image_mean.exe,位於目錄\caffe-windows\Build\x64\Release下。回到caffe-windows根目錄下建立一個mnist_mean.txt,寫入如下內容:

 

我的是生成lmdb格式。   

 

 

將字尾名改為bat後雙擊執行(其實寫了那麼多bat檔案也應該有體會了,只要指定的路徑正確就行,不一定非要放在caffe-windows根目錄下)。正確執行的話會在根目錄下產生一個mean.binaryproto,也就是我們所需要的均值檔案。接著為了使用均值檔案需要稍微修改下層的定義。所以開啟\examples\mnist\lenet_train_test.prototxt,做如下修改:

 

 

    到此為止,均值檔案的預處理部分處理完畢,下面就可以進行測試了。

二、利用mnist測試集進行測試

   這部分比較簡單,因為之前生成的Caffe.exe就可以直接用來進行測試。同樣地在caffe-windows目錄下新建mnist_test.txt,並寫入如下內容(其中的間斷處都為一個空格)。

 

   意思也顯而易見,首先指定為測試模式,隨後指定模型和訓練出來的引數。

   將字尾名改為bat後雙擊執行,結果如下所示:

 

 

   左側的內容依舊是GLOG的記錄日誌,右側中的Batch需要和網路引數初始中的batch_size一起理解。每個Batch中包含了batch_size張測試圖片,所以每個Batch的準確率是對這batch_size張測試圖片整體而言的。而不是像我最初一樣先入為主地以為準確率應該是對每張測試圖片而言,故只有0和1兩種情況。

   這邊個人也有個小問題,Batch之所以為0-49共50個是由caffe.cpp中一個叫做FLAGS_iterations的變數指定的,但是找來找去實在無法確定這個變數是否是由網路引數確定的,之後再好好看一下程式碼。

   這個準確率不能說特別好,因為我有空也嘗試過Tensorflow,Tensorflow官方文件中的一個多層卷積網路對mnist測試集的準確率為99.2%左右。不過到此為止我們已經完成了mnist測試集在caffe上的執行和測試。

三、利用自己的手寫數字進行測試

   主要參考了http://blog.csdn.net/zb1165048017/article/details/52217772這篇文章,不過還是有些細節需要更改。

(1)首先可以按照上面網址教程中的第六和第七步在\examples\mnist目錄下生成手寫的一個28*28畫素數字的bmp檔案和一個標籤檔案label.txt。比如我手寫的數字如下圖所示:

 

 

   這裡需要注意的是上述教程中的matlab程式碼最後一句需要更改。例如我已經將matlab的工作目錄設為\caffe-windows\examples\mnist,就可以直接輸入(test1為我的手寫數字檔名):

 

(2)之後就可以呼叫之前生成的classification.exe進行分類。同樣的在caffe-windows目錄下新建test_personaldig.txt並寫入如下內容:

 

    中間的三行其實是每個加一個空格後跟在examples\mnist\lenet.prototxt的後面,這裡為了顯示地更加清楚而進行了換行。更改字尾為bat後就可以雙擊執行,會出現類似下面的內容:

 

   可見分類結果正確。讓我們再來測試一個下圖寫得一個比較飄逸的5。

 

分類結果還是正確的。

 

 

四、後記

   到此為止我們已經完成了利用mnist測試集對生成的模型進行準確率測試,併成功對自己手寫的數字進行了識別,總之效果還不差。然而至此教程甚至根本沒有提及過卷積神經網路,可見caffe的確可以讓一個完全不懂卷積神經網路原理的人通過不斷手動調整引數完成學習,實現分類等目標,甚至還能取得非常不錯的效果。就像程式設計師和數學的關係一樣,知曉了卷積神經網路的詳細原理對我們使用caffe只有好處沒有壞處,並且要真正做到看懂caffe的每個模組必須瞭解卷積神經網路。博主自己也正在深入學習卷積神經網路,這裡推薦一個非常好的入門資料CS231n Convolutional Neural Networks for Visual Recognition

http://cs231n.github.io/convolutional-networks/

   上面網址中的教程對卷積神經網路的基礎知識講述得非常透徹清楚。但如果想繼續瞭解其中的數學推導的話,建議再看下面這篇文章:

Notes on Convolutional Neural Networks, Jake Bouvrie