標籤:check iss comm 目錄結構 應該 cpu 無語 dia 原因
一、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.prototxtpause
意思為使用編譯產生的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.caffemodelpause
意思是,首先是找到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_leveldbInvalid 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的每個模板,而之要求我們必須瞭解深度學習的理論知識。所以,要想取得實質性的突破,還有很長的路要走!
以上。
windows下的cafee訓練和測試mnist資料集