一、mnist數據集
mnist是一個手寫數字數據庫,由Google實驗室的Corinna Cortes和紐約大學柯朗研究院的Yann LeCun等人建立,它有60000個訓練樣本集和10000個測試樣本集。mnist數據庫官方網址為:http://yann.lecun.com/exdb/mnist/ 。可直接下載四個解壓文件,分別對應:訓練集樣本、訓練集標簽、測試集樣本和測試集標簽。解壓縮之后發現,其是在一個文件中包含了所有圖像。
二、caffe支持的數據格式:Lmdb和Leveldb
- 它們都是鍵/值對(Key/Value Pair)嵌入式數據庫管理系統編程庫。
- 雖然lmdb的內存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允許多種訓練模型同時讀取同一組數據集。
- 因此lmdb取代了leveldb成為Caffe默認的數據集生成格式。
三、mnist數據集的處理
caffe並不能直接使用下載得到的四個文件進行訓練,而是會把它轉化為lmdb或leveldb格式進行讀取。目前我使用的是leveldb格式。由於還沒有具體研究如何將數據集向lmdb或leveldb格式轉化,所以目前使用的是網盤下載的資源,鏈接如下:
http://pan.baidu.com/s/1c2G9qyk 提取碼:xama。里面是已經經過轉換的leveldb格式的訓練集和測試集,將這兩個文件夾直接放到\examples\mnist目錄下,如下圖所示:
四、訓練caffe模型
訓練caffe模型需要用到幾個文件,首先是train_lenet.bat,打開看到其內容如下:
即該文件指定要使用lenet_solver.prototxt文件,那我們就看看該文件吧!
將最后一行solver_mode改為CPU;(為什么我不用GPU呢?后面再解釋!)可以看出,這個文件是對網絡訓練參數進行指定:max_iter指定了最大迭代次數,默認為10000次,snapshot是輸出中間結果,默認為迭代到5000次時輸出中間結果。
文件的開頭也指明了,使用lenet_train_test.prototxt文件指定的網絡進行訓練和測試。
打開lenet_train_test.prototxt,做如下修改以正確指定訓練集和測試集。
其中source指定了mnist的訓練集和測試集的文件夾所在路徑,注意,此處是相對路徑,這個很關鍵,原因后面再提!
backend指定了數據集的格式,使用的是leveldb。
之后,點擊examples/mnist目錄下的train_lenet.bat批處理文件,即可實現對mnist數據集的訓練,train_lenet.bat文件內容為:
cd ../../ "caffe/bin/caffe.exe" train --solver=examples/mnist/lenet_solver.prototxt pause
意思為使用編譯生成的caffe.exe進行訓練,訓練使用的解決策略由lenet_solver.prototxt來指定。
如果不出意外,等待一段時間后,即可得到如下界面:
可以看到,打印信息的格式是有規律的,
左側是caffe采用的GLOG庫內方法打印的信息,這個庫主要起記錄日志的功能,方便出現問題時查找根源,具體格式為:
[日期] [時間] [進程號] [文件名] [行號]
往右即為當前迭代次數以及損失值(訓練過程不輸出准確率accuracy)。
當看到Optimization Done字樣時,說明模型訓練完成。訓練得到的模型存儲在目錄\examples\mnist下(后綴名為caffemodel和solverstate),如下圖所示:
分別是訓練至一半和訓練最終完成后的模型。接下來即可用這模型對mnist的測試集進行測試。
五、mnist數據集的測試
編譯生成的caffe.exe可以直接用於測試。在目錄\examples\mnist下新建mnist_test.bat批處理文件,並寫入如下內容:
cd ../../ caffe\bin\caffe.exe test --model=examples\mnist\lenet_train_test.prototxt -weights=examples\mnist\lenet_iter_10000.caffemodel pause
意思是,首先是找到caffe.exe並運行->指定為測試模式->指定網絡測試參數->指定模型。
運行mnist_test.bat,結果顯示如下:
左側的內容依舊是GLOG的記錄日志,右側中的Batch需要和網絡參數初始中的batch_size一起理解。每個Batch中包含了batch_size張測試圖片,所以每個Batch的准確率是對這batch_size張測試圖片整體而言的。而不是對每張測試圖片而言的。
六、遇到的問題
前面有提到兩點,當時說在后面會解釋。現在在該部分展開說明。
1、為什么我在解決策略文件lenet_solver.prototxt中,要將solver_mode改為CPU呢?
答:因為在我的機器中,solver_mode使用GPU的話,訓練時出錯,錯誤的提示如下:
Check failed: error == cudaSuccess <11 vs. 0> invalid argument
網上查了一下這個錯誤,給的最多的解釋是:該錯誤是由顯卡的計算能力不足導致的。
遇到這個問題的網友還是有的,但給出的解決方案我沒有看懂,github上https://github.com/rbgirshick/rcnn/issues/28有一個解決方案:
I added the following lines to commands using multiple “arch” flags in Nvidia's NVCC compiler, and the error does not occur anymore. -gencode=arch=compute_20,code=\"sm_20,compute_20\" -gencode=arch=compute_30,code=\"sm_30,compute_30\" -gencode=arch=compute_35,code=\"sm_35,compute_35\" -gencode=arch=compute_50,code=\"sm_50,compute_50\"
網友說親測能解決
但我不知道如何修改。
還有的網友說是要設置顯卡的計算能力http://www.cnblogs.com/yymn/articles/5389904.html ,但我也不知道如何設置。
所以這個問題,暫時放在這里,待日后找到解決方法后再回來更新!
2、第二個問題之前的描述如下:
這個“相對路徑”是相對於哪里呢?就是相對於你運行caffe.exe后,所處在的路徑位置!再來回看一下我的mnist_test.bat內容吧
我在運行目錄caffe\bin下的caffe.exe應用程序之前,已經執行了cd../../將我目前的路徑返回上上層目錄,我的目錄結構如下圖所示:
執行cd../../后,我來到了F:\caffe\目錄下,此時,我在我的mnist_test.bat內能通過相對路徑 examples\mnist\lenet_train_test.prototxt 找到網絡參數描述文件,而且也能在lenet_train_test.prototxt中的source處指定的相對路徑處,找到mnist測試集的文件夾所在位置:
這樣來看,調用caffe.exe完成mnist數據集的測試過程中,其如何去找相關文件就很清楚了!
我犯的錯誤是:我之前在mnist_test.bat批處理文件寫入的內容是:
可以看到,所有的路徑我都是使用絕對路徑,這是我為了防止調用錯誤特地難為自己的。但lenet_train_test.prototxt中,我在source指定的還是相對路徑:
source:"examples\mnist\mnist_test_leveldb"
當時沒想過會出錯,可當我執行mnist_test.bat時,出現了
錯誤描述為:
Check failed: status.ok() Failed to open leveldb examples/mnist/mnist_test_leveldb Invalid argument: examples/mnist/mnist_test_leveldb: does not exist (create_if_missing is false)
當時我在檢查錯誤的時候,完全沒想過是由於相對路徑設置得不對導致的,一直在檢查是不是我在mnist_test.bat中設置的路徑有誤,浪費了很多時間。
后面我無意打開lenet_train_test.prototxt 才發現,source指定的是相對路徑,那這個相對路徑是相對於哪個位置的呢?因為我的測試集所在路徑為:
而source中為 那么我所處的位置應該要在F:\caffe\,這樣我才能根據source找到測試集文件夾mnist_test_leveldb。
而我在mnist_test.bat中,並沒有將我的位置定位到F:\caffe\ ,因為mnist_test.bat是在F:\caffe\examples\mnist\下的,若不將路徑定位到F:\caffe\ ,則程序會根據source指定的相對路徑,在F:\caffe\examples\mnist\下尋找
,而F:\caffe\examples\mnist\下根本不存在
這個路徑,所以就會出現找不到文件夾mnist_test_leveldb的情況!
當然,如果在source中使用絕對路徑來指定mnist_test_leveldb,即
再運行這個mnist_test.bat批處理文件:
就不會出錯了!
運行的結果如下:
小結:
可能是我對文件路徑的理解程度和敏感程度不夠,常常會在路徑問題上出錯,或許在別人看來,這根本不是什么值得拿出來提及的問題,但於我而言,真的是浪費了很多時間在指定文件路徑上。這一次使用caffe來測試mnist數據集,又一次浪費了很多時間在這個問題上!真是無語-。-|||
七、總結
雖然一路艱辛,但總算是把caffe用起來了!通篇下來,你會發現,我完全沒有提及任何枯燥乏味的理論知識,連深度學習中最重要的卷積神經網絡我也只字未提,可見caffe的確可以讓一個完全不懂卷及神經網絡原理的人通過不斷手動調整參數完成學習,實現分類等目標,且取得的效果還不錯。
當然這只是對於那些想試試caffe威力的人而言,真正要將caffe用於你的應用項目中,需要看懂caffe的每個模板,而之要求我們必須了解深度學習的理論知識。所以,要想取得實質性的突破,還有很長的路要走!
以上。