上一篇記錄的是學習caffe前的環境準備以及如何建立好本身須要的caffe版本。這一篇記錄的是如何使用編譯好的caffe作訓練mnist數據集,步驟編號延用上一篇 《實踐詳細篇-Windows下使用VS2015編譯安裝Caffe環境(CPU ONLY) 》的順序。html
一、下載MNIST數據集,MNIST數據集包含四個文件信息,見表格:數據庫
文件編程 |
內容網絡 |
訓練集圖片 - 55000 張 訓練圖片, 5000 張 驗證圖片學習 |
|
訓練集圖片對應的數字標籤ui |
|
測試集圖片 - 10000 張 圖片spa |
|
測試集圖片對應的數字標籤 |
下載完MNIST數據集包後打開\caffe根目錄\examples\mnist並在其中建立一個文件夾mnist_data。並將其四個數據包進行解壓到這個目錄中。
注意:這四個文件不能直接用於caffe的訓練和測試。須要使用編譯好的caffe項目中的convert_mnist_data-d.exe文件來把四個文件轉換爲caffe所支持的leveldb或lmdb文件。convert_mnist_data-d.exe文件存在於caffe根目錄\scripts\build\examples\mnist\Debug或Release目錄下。選擇區分取決於編譯時是選擇的Debug仍是Release。
二、建立命令腳原本調用convert_mnist_data.exe數據轉換工具
2.1 在caffe根目錄下,新建一個convert-mnist-data-train.bat文件用於作轉換訓練數據,並在文件中添加以下代碼:
scripts\build\examples\mnist\Debug\convert_mnist_data-d.exe --backend=lmdb examples\mnist\mnist_data\train-images.idx3-ubyte examples\mnist\mnist_data\train-labels.idx1-ubyte examples\mnist\mnist_data\mnist_train_lmdb pause
注意:scripts\build\examples\mnist\Debug\convert_mnist_data-d.exe 這個文件就是數據轉換的工具,若是是使用Debug編譯的 那文件將是convert_mnist_data-d.exe 如是Release編譯的將是convert_mnist_data.exe 這個文件 。其中--backend=lmdb 表示轉換爲lmdb格式,這裏設置的轉換數據格式決定了後期使用時修改配置文件對應的格式。若要轉換爲leveldb將其改寫爲--backend=leveldb 便可。backend=leveldb後面的參數就是解壓出來的數據集的文件路徑。
leveldb和lmdb格式區別:
它們都是鍵/值對(Key/Value Pair)嵌入式數據庫管理系統編程庫。
雖然lmdb的內存消耗是leveldb的1.1倍,可是lmdb的速度比leveldb快10%至15%,更重要的是lmdb容許多種訓練模型同時讀取同一組數據集。
所以lmdb取代了leveldb成爲Caffe默認的數據集生成格式。
2.2 再新建一個convert-mnist-data-test.bat轉換測試數據,並在文件中添加以下代碼:
scripts\build\examples\mnist\Debug\convert_mnist_data-d.exe --backend=lmdb examples\mnist\mnist_data\t10k-images.idx3-ubyte examples\mnist\mnist_data\t10k-labels.idx1-ubyte examples\mnist\mnist_data\mnist_test_lmdb Pause
2.3 運行兩個腳本文件進行調用轉換測試/訓練數據
2.3.1 運行轉換測試數據-convert-mnist-data-test.bat
切入到caffe根目錄並Shift+鼠標右鍵選擇「在此處打開命令窗口」 而後輸入
start convert-mnist-data-test.bat
調用異常:
如出現以上狀況,多數是由於文件夾的編碼格式致使的,由於UTF-8的緣由致使自動在文本最開始添加了一個空格內容致使的,解決方法很簡單,從新編輯該文件並保存的時候將格式修改成 ANSI格式便可。
D:\DeepLearning\caffe\caffe>鍩縮cripts\build\examples\mnist\Debug\convert_mnist_ data-d.exe --backend=lmdb examples\mnist\mnist_data\t10k-images.idx3-ubyte examp les\mnist\mnist_data\t10k-labels.idx1-ubyte examples\mnist\mnist_data\mnist_test _lmdb 系統找不到指定的路徑。 D:\DeepLearning\caffe\caffe>Pause
調用成功:
如下代碼就是命令反饋的轉換成功示例
D:\DeepLearning\caffe\caffe>scripts\build\examples\mnist\Debug\convert_mnist_dat a-d.exe --backend=lmdb examples\mnist\mnist_data\t10k-images.idx3-ubyte examples \mnist\mnist_data\t10k-labels.idx1-ubyte examples\mnist\mnist_data\mnist_test_lm db I0427 09:47:11.591769 8508 db_lmdb.cpp:40] Opened lmdb examples\mnist\mnist_dat a\mnist_test_lmdb I0427 09:47:11.593770 8508 convert_mnist_data.cpp:93] A total of 10000 items. I0427 09:47:11.593770 8508 convert_mnist_data.cpp:94] Rows: 28 Cols: 28 I0427 09:47:11.983791 8508 db_lmdb.cpp:112] Doubling LMDB map size to 2MB ... I0427 09:47:12.180804 8508 db_lmdb.cpp:112] Doubling LMDB map size to 4MB ... I0427 09:47:12.514822 8508 db_lmdb.cpp:112] Doubling LMDB map size to 8MB ... I0427 09:47:13.059854 8508 db_lmdb.cpp:112] Doubling LMDB map size to 16MB ... I0427 09:47:13.225862 8508 convert_mnist_data.cpp:113] Processed 10000 files. D:\DeepLearning\caffe\caffe>Pause
2.3.2 運行轉換訓練數據
start convert-mnist-data-train.bat
調用成功:
D:\DeepLearning\caffe\caffe>scripts\build\examples\mnist\Debug\convert_mnist_dat a-d.exe --backend=lmdb examples\mnist\mnist_data\train-images.idx3-ubyte example s\mnist\mnist_data\train-labels.idx1-ubyte examples\mnist\mnist_data\mnist_train _lmdb I0427 09:50:03.852622 8384 db_lmdb.cpp:40] Opened lmdb examples\mnist\mnist_dat a\mnist_train_lmdb I0427 09:50:03.854622 8384 convert_mnist_data.cpp:93] A total of 60000 items. I0427 09:50:03.854622 8384 convert_mnist_data.cpp:94] Rows: 28 Cols: 28 I0427 09:50:03.942627 8384 db_lmdb.cpp:112] Doubling LMDB map size to 2MB ... I0427 09:50:04.006631 8384 db_lmdb.cpp:112] Doubling LMDB map size to 4MB ... I0427 09:50:04.131639 8384 db_lmdb.cpp:112] Doubling LMDB map size to 8MB ... I0427 09:50:04.398653 8384 db_lmdb.cpp:112] Doubling LMDB map size to 16MB ... I0427 09:50:05.002688 8384 db_lmdb.cpp:112] Doubling LMDB map size to 32MB ... I0427 09:50:06.283761 8384 db_lmdb.cpp:112] Doubling LMDB map size to 64MB ... I0427 09:50:08.547890 8384 convert_mnist_data.cpp:113] Processed 60000 files. D:\DeepLearning\caffe\caffe>pause
全部數據轉換完成後能夠在存放數據集文件目錄下發現多出來了兩個文件夾,並文件夾中都各有兩個文件 分別lock.mdb和data.mdb
三、運行測試
3.1 拷貝轉換好的測試文件以及訓練文件到 caffe根目錄\examples\mnist文件夾中 如圖:
3.2 編寫調用腳本
在caffe根目錄下新建一個run.bat文件,文件中代碼:
D:\DeepLearning\caffe\caffe\scripts\build\tools\Debug\caffe-d.exe train --solver=examples\mnist\lenet_solver.prototxt pause
注意:D:\DeepLearning\caffe\caffe\scripts\build\tools\Debug\caffe-d.exe 最好填寫的是使用絕對路徑。使用caffe-d.exe仍是caffe.exe取決與你編譯時選擇的方式。caffe-d.exe存放於Debug下,caffe.exe存放Release目錄下。
3.3 運行文件
確保萬一,以前有提到過,在2.1步驟的時候說過,設置的轉換數據格式決定後期調用文件的格式,因此咱們須要先確認lenet_train_test.prototxt文件中的格式是否一致。
如這裏的格式和在轉換數據集的時候不一致 將須要修改成一致,簡單的就是直接修改這裏的配置文件格式改成leveldb或lmdb。否則就是在轉換的時候修改成和這裏一致。沒問題的話咱們直接運行:
發現運行出現錯誤了,看錯誤反饋大體是由於選擇的訓練方式有問題,不能使用GPU。咱們安裝caffe時就說過,咱們使用的是CPU訓練。因此這裏出現異常確定是由於配置出問題了。咱們打開 lenet_solver.prototxt文件看看:
# The train/test net protocol buffer definition net: "examples/mnist/lenet_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. test_iter: 100 # Carry out testing every 500 training iterations. test_interval: 500 # The base learning rate, momentum and the weight decay of the network. base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 # The learning rate policy lr_policy: "inv" gamma: 0.0001 power: 0.75 # Display every 100 iterations display: 100 # The maximum number of iterations max_iter: 10000 --指定了最大迭代次數 默認爲10000次 # snapshot intermediate results snapshot: 5000 是輸出中間結果,默認爲迭代到5000次時輸出中間結果。 snapshot_prefix: "examples/mnist/lenet" # solver mode: CPU or GPU solver_mode: GPU --此處應該應該爲CPU 由於咱們使用的是CPU訓練
能夠經過代碼註釋發現文本顯示 「# solver mode: CPU or GPU」 意思是能夠選擇CPU或GPU,可是因爲咱們前期配置的是CPU,因此咱們這裏應該修改成CPU來訓練。修改完成後咱們繼續執行run.bat
經過運行後的命令窗口反饋是已經正在訓練提取特徵了了,沒報錯表示成功了。
歷經幾天的學習和嘗試,一路磕磕碰碰也總算是將caffe給弄起來了,雖然只是表面使用,並無真正的達到「深度學習」,可是也是值的欣慰的。兩篇博客下來會發現我徹底沒有說起任何枯燥乏味的理論知識,由於我深知有些牛逼的東西對於咱們這種初學者而言不是要記住長篇大論的理論,而是在於本身能動手實踐從中先獲取到成就感,這樣纔會有興趣學下去。我在某課堂也看了一點課程,發現整節課下來都是講的理論知識,講的卷積神經網絡和循環神經網絡等等,這些過於專業的理論知識有些時候反而會讓咱們這種新人沒法理解,致使在必定程度上打壓了興趣。因此可見caffe可讓一個徹底不懂卷及神經網絡原理的人經過閱讀相關編譯、搭建知識來實現caffe圖像分類識別等效果。固然這種效果只是適合初學者來提升興趣愛好,真正的大牛仍是須要不斷的學習,更深刻的瞭解深度學習的理論知識看來提高自我達到取得實質性的突破。