從零到一:caffe-windows(CPU)配置與利用mnist數據集訓練第一個caffemodel

1、前言linux

    本文會詳細地闡述caffe-windows的配置教程。因爲博主本身也只是個在校學生,目前也寫不了太深刻的東西,因此準備從最基礎的開始一步步來。我的的計劃是分紅配置和運行官方教程,利用本身的數據集進行訓練和利用caffe來實現別人論文中的模型(目前在嘗試的是輕量級的SqueezeNet)三步走。不求深度,但求詳細。由於說實話caffe-windows的配置當初花了挺多時間的,目前貌似還真沒有從頭開始一步步講起的教程,因此博主就爭取試着每一步都講清楚吧。ios

    這裏說些題外話:之因此選擇SqueezeNet是由於相比於目前互聯網行業深度學習應用的火熱,移動設備端的深度學習應用實在少得可憐。若是我沒記錯地話,蘋果在2016年9月7日發佈會中提到了機器學習兩次,其中ios10的一個亮點就是利用深度學習技術實現照片中人臉的自動識別歸類,私下裏測試了下效果很不錯。固然缺點也顯而易見:因爲須要大量的計算,目前只在用戶接通電源的狀況下才會去識別。個人師兄們也嘗試過用深度學習作移動設備端應用的開發,不過最後因爲花費時間太長改爲了上傳到服務器端完成。因此計算量大應該算是深度學習應用向移動設備端轉移的一個很大問題。不過,有理由相信從此移動設備端的深度學習應用會變得愈來愈多,也會是一個前景廣闊的市場。git

2、環境github

    系統版本:Windows 10 專業版 64位windows

    Visual Studio版本:Visual Studio Ultimate 2013服務器

    均可以從itellyou上下載到,強烈推薦使用上述版本的Visual Studio(如下簡稱VS)。網絡

3、詳細步驟app

caffe-windows配置部分機器學習

(1)確保正確安裝了VS後首先下載caffe-windows源代碼,網址以下:學習

      https://github.com/BVLC/caffe/tree/windows

   我下載獲得的caffe-windows.zip的MD5值爲:8F2804014EF395094584230A4A9EE8A6,不排除後續源代碼更新致使本教程失效的可能,所以保險的話能夠校驗一下。

(2)解壓後進入以下路徑:\caffe-windows\windows(以後路徑均默認在caffe-windows文件夾下,所以都省略\caffe-windows)

   在\windows目錄下複製文件 CommonSettings.props.example(應該會以副本形式出現CommonSettings.props - 副本.example),並將該副本更名爲CommonSettings.props。(請確認顯示文件擴展名這個選項已生效)

(3)用VS打開CommonSettings.props,進行以下兩個更改後保存退出。

   1.第7行的false改爲true;2.第8行的true改爲false;更改後效果以下:

1

   若是是像我同樣的初學者不推薦一開始就配置GPU版本的caffe,由於又會有不少問題出現,容易打消積極性,更應該先利用CPU版本初步掌握caffe後再進一步研究GPU版本。

(4)用VS打開\windows下的Caffe.sln,加載完成後右鍵點擊解決方案資源管理器中的解決方案Caffe,選擇啓用NuGet程序包還原(VS會自動地將caffe要用到的第三方庫下載完成,就功能來講仍是很方便的,有點相似linux的apt-get,還不用擔憂版本問題。不過就caffe實際用這個還原第三方庫的體驗來講真不咋的),以下圖所示:

2    接下來的過程十分漫長,還有可能出現未響應或下載中斷的狀況。

    我想了一種可取且可行的方案:在第四步打開Caffe.sln以前先下載別人已經下載好的NugetPackages文件夾,並放到和caffe-windows文件夾的同級目錄下。這樣以後再打開Caffe.sln時可以自動識別出來(親自試了一下是可行的)。提供一個NugetPackages文件夾的壓縮包:http://pan.baidu.com/s/1qYpg3bY,提取碼f2zx。

    若是本身能夠下載,那下載完成後會在caffe-windows文件同級目錄下出現一個新的NugetPackages文件夾(裏面有16個子文件夾,都是caffe須要用到的庫,以後會結合實際運行結果簡單介紹下這些庫)。若是點擊上圖中的管理解決方案的NuGet程序包(G)還能夠看到這些庫的簡要信息,以下圖所示:

3

(5)以後點擊項目-屬性(或直接右擊解決方案Caffe選擇屬性),把配置修改爲Release x64,並將生成所有勾上,以下圖所示。最後就能夠點生成解決方案了,而後又是較長的等待。。

4

    這裏會出現一個問題,單獨說明下:

    報出相似下面的錯誤:

     error LNK1104:沒法打開文件「libcaffe.lib

    網上的解決方案是對libcaffe單獨從新生成,以下圖所示:

15

    但這樣的話會出現另一個錯誤:

    error C2220:警告被視爲錯誤-沒有生成「object」文件

    若是出現這樣的錯誤,請打開項目-屬性按照下圖進行更改:

16

    以後再對libcaffe從新生成應該就能夠成功經過。

    最後再點擊生成-生成解決方案應該就能夠生成成功了。至此caffe-windows配置完成。進入目錄\caffe-windows\Build\x64\Debug裏面衆多的可執行文件都會在以後用到。

    其實Debug也是能夠的,可是這樣的話以後每次都要打開VS,總以爲有點不方便,因此後面仍是經過本身寫bat文件調用caffe。Debug的方法能夠參考這篇文章[2]。

    到了這一步恭喜你配置已經完成了。接下來就能夠用mnist數據集生成模型了。

mnist數據集測試部分

  這部分原本應該分開來寫的,但因爲完成了caffe-windows配置部分也不知道到底配置得正不正確,因此仍是一氣呵成地用機器學習的Hello World程序:mnist手寫數字數據集來測試下。

(1)首先下載mnist數據集http://yann.lecun.com/exdb/mnist/這裏須要注意的是caffe並不直接經過下載獲得的四個文件進行訓練,而是會把它轉化爲lmdb或leveldb格式進行讀取。lmdb是lightning(閃電的) memory-mapped database manager的縮寫,可以把原始數據經過更爲高效的存儲方式存儲,從而加快讀取和訓練速度(lmdb比leveldb更快,能夠看看剛剛的NugetPackages文件夾,當中就包含着對應的庫)。

    實現這個轉化的代碼是\examples\mnist的convert_mnist_data.cpp,但也不必看,由於它的運行腳本create_mnist.sh顯然是linux下的東西。想了想也能夠理解,畢竟caffe原本也不支持windows,能移植過來就不錯了,也不能期望大牛們把全部例子的代碼都一併移植過來。後續教程會專門介紹如何實現本身的數據集向lmdb和leveldb轉換。目前更很好的辦法就是直接網盤下載,這裏分享一個http://pan.baidu.com/s/1c2G9qyk 提取碼xama。

    裏面是已經通過轉換的leveldb格式的訓練集和測試集,把這兩個文件夾直接放到\examples\mnist目錄下,以下圖所示:

6

(2)在正式運行前還有幾個文件中須要進行改動,首先用VS打開\examples\mnist目錄下的lenet_solver.prototxt,將最後一行改爲CPU:

7

   能夠看到,這個文件是對網絡訓練參數進行指定:max_iter指定了最大迭代次數,snapshot是輸出中間結果。上圖中的參數已經修改過,初始的max_itersnapshot是10000和5000。

   接着再用VS打開\examples\mnist目錄下的lenet_train_test.prototxt,作以下修改以正確指定訓練集和測試集。

8

    這裏額外介紹下caffe-windows採用的LeNet-5模型,也就是上圖中layer的定義方式。因爲以後本身寫代碼實現模型時確定須要對LeNet-5模型有了解,因此提供該模型的原始資料以供參考。

http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

   其實平時看些別人論文中提供的代碼,上述兩個文件也算是論文和代碼的核心所在。基本都是提供本身編寫的上述兩個文件,再加上最終訓練出來的caffemodel,日誌和幾張效果圖。好比下圖就是SqueezeNet提供的的:

13

(3)完成上述工做後就能夠編寫bat腳本進行正式訓練了。回到caffe-windows的根目錄下新建一個run.txt並寫入如下內容(本身敲一遍感受效果更佳,特別是像我同樣以前對bat文件徹底不懂的人):

14

    將後綴名改爲bat後雙擊運行,不出意料,應該會出現相似以下的訓練過程:

9

4、mnist運行結果

    我清除解決方案後按照上述步驟從新試了一次,沒有出現問題。固然也仍是不能保證100%能運行,因此若是出現任何錯誤的話歡迎交流。

    下面就對運行的結果進行一些簡單的解釋:

    最前面的部分是打印各類信息(包括是用CPU仍是GPU、訓練參數、網絡參數等等),相似下圖內容:

10

    以後即爲和下圖同樣的正式訓練過程,能夠看到打印信息的格式也是有規律的:

11

    左側爲caffe採用的GLOG庫內方法打印的信息,這個庫主要起記錄日誌的功能,方便出現問題時查找根源,具體格式爲:

[日期] [時間] [進程號] [文件名] [行號]

    往右即爲當前迭代次數以及損失值(訓練過程不輸出準確率accuracy)。

   當迭代次數達到lenet_solver.prototxt定義的max_iter時,就能夠認爲訓練結束了。而且最終會在目錄\examples\mnist下產生訓練出的模型(文件後綴名爲caffemodel和solverstate),以下圖所示:

12

    分別是訓練至一半和訓練最終完成後的模型。接下來能夠用這模型對mnist的測試集和本身手寫的數字進行測試(見下篇教程)。

5、結語

    也許到目前爲止你仍是感受caffe像個黑盒同樣,沒法洞悉它的具體工做過程。但至少到這一步爲止你已經完成了最初的caffe配置過程併成功利用mnist數據訓練出了第一個caffemodel。以後的東西雖然不能說簡單,但並無這最初的一步來得意義重大。完成了Step ZERO to ONE,就能飽含信心的繼續下去,進一步探究caffe(好像雞湯了?)。在接下來的教程中會用到該模型對mnist數據集以及你本身手寫的圖片進行測試。後者仍是頗有趣的。

6、參考

[1]深度學習21天實戰Caffe 趙永科 電子工業出版社

(雖然這本書因爲大量地貼代碼,評價不是太好,但對初學者仍是有不少可取之處的)

[2]http://m.blog.csdn.net/article/details?id=51355143

[3]Caffe官方教程中譯本 社區預覽版

相關文章
相關標籤/搜索