一、前言
本文會詳細地闡述caffe-windows的配置教程。由於博主自己也只是個在校學生,目前也寫不了太深入的東西,所以准備從最基礎的開始一步步來。個人的計划是分成配置和運行官方教程,利用自己的數據集進行訓練和利用caffe來實現別人論文中的模型(目前在嘗試的是輕量級的SqueezeNet)三步走。不求深度,但求詳細。因為說實話caffe-windows的配置當初花了挺多時間的,目前貌似還真沒有從頭開始一步步講起的教程,所以博主就爭取試着每一步都講清楚吧。
這里說些題外話:之所以選擇SqueezeNet是因為相比於目前互聯網行業深度學習應用的火熱,移動設備端的深度學習應用實在少得可憐。如果我沒記錯地話,蘋果在2016年9月7日發布會中提到了機器學習兩次,其中ios10的一個亮點就是利用深度學習技術實現照片中人臉的自動識別歸類,私下里測試了下效果很不錯。當然缺點也顯而易見:由於需要大量的計算,目前只在用戶接通電源的情況下才會去識別。我的師兄們也嘗試過用深度學習做移動設備端應用的開發,不過最后由於花費時間太長改成了上傳到服務器端完成。所以計算量大應該算是深度學習應用向移動設備端轉移的一個很大問題。不過,有理由相信今后移動設備端的深度學習應用會變得越來越多,也會是一個前景廣闊的市場。
二、環境
系統版本:Windows 10 專業版 64位
Visual Studio版本:Visual Studio Ultimate 2013
都可以從itellyou上下載到,強烈推薦使用上述版本的Visual Studio(以下簡稱VS)。
三、詳細步驟
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;更改后效果如下:
如果是像我一樣的初學者不推薦一開始就配置GPU版本的caffe,因為又會有很多問題出現,容易打消積極性,更應該先利用CPU版本初步掌握caffe后再進一步研究GPU版本。
(4)用VS打開\windows下的Caffe.sln,加載完成后右鍵點擊解決方案資源管理器中的解決方案Caffe,選擇啟用NuGet程序包還原(VS會自動地將caffe要用到的第三方庫下載完成,就功能來說還是很方便的,有點類似linux的apt-get,還不用擔心版本問題。不過就caffe實際用這個還原第三方庫的體驗來說真不咋的),如下圖所示:
我想了一種可取且可行的方案:在第四步打開Caffe.sln之前先下載別人已經下載好的NugetPackages文件夾,並放到和caffe-windows文件夾的同級目錄下。這樣之后再打開Caffe.sln時能夠自動識別出來(親自試了一下是可行的)。提供一個NugetPackages文件夾的壓縮包:http://pan.baidu.com/s/1qYpg3bY,提取碼f2zx。
如果自己可以下載,那下載完成后會在caffe-windows文件同級目錄下出現一個新的NugetPackages文件夾(里面有16個子文件夾,都是caffe需要用到的庫,之后會結合實際運行結果簡單介紹下這些庫)。如果點擊上圖中的管理解決方案的NuGet程序包(G)還可以看到這些庫的簡要信息,如下圖所示:
(5)之后點擊項目-屬性(或直接右擊解決方案Caffe選擇屬性),把配置修改成Release x64,並將生成全部勾上,如下圖所示。最后就可以點生成解決方案了,然后又是較長的等待。。
這里會出現一個問題,單獨說明下:
報出類似下面的錯誤:
error LNK1104:無法打開文件“libcaffe.lib”
網上的解決方案是對libcaffe單獨重新生成,如下圖所示:
但這樣的話會出現另外一個錯誤:
error C2220:警告被視為錯誤-沒有生成“object”文件
如果出現這樣的錯誤,請打開項目-屬性按照下圖進行更改:
之后再對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目錄下,如下圖所示:
(2)在正式運行前還有幾個文件中需要進行改動,首先用VS打開\examples\mnist目錄下的lenet_solver.prototxt,將最后一行改成CPU:
可以看到,這個文件是對網絡訓練參數進行指定:max_iter指定了最大迭代次數,snapshot是輸出中間結果。上圖中的參數已經修改過,初始的max_iter和snapshot是10000和5000。
接着再用VS打開\examples\mnist目錄下的lenet_train_test.prototxt,做如下修改以正確指定訓練集和測試集。
這里額外介紹下caffe-windows采用的LeNet-5模型,也就是上圖中layer的定義方式。由於之后自己寫代碼實現模型時肯定需要對LeNet-5模型有了解,所以提供該模型的原始資料以供參考。
http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
其實平時看些別人論文中提供的代碼,上述兩個文件也算是論文和代碼的核心所在。基本都是提供自己編寫的上述兩個文件,再加上最終訓練出來的caffemodel,日志和幾張效果圖。比如下圖就是SqueezeNet提供的的:
(3)完成上述工作后就可以編寫bat腳本進行正式訓練了。回到caffe-windows的根目錄下新建一個run.txt並寫入以下內容(自己敲一遍感覺效果更佳,特別是像我一樣之前對bat文件完全不懂的人):
將后綴名改成bat后雙擊運行,不出意料,應該會出現類似如下的訓練過程:
四、mnist運行結果
我清除解決方案后按照上述步驟重新試了一次,沒有出現問題。當然也還是不能保證100%能運行,所以如果出現任何錯誤的話歡迎交流。
下面就對運行的結果進行一些簡單的解釋:
最前面的部分是打印各種信息(包括是用CPU還是GPU、訓練參數、網絡參數等等),類似下圖內容:
之后即為和下圖一樣的正式訓練過程,可以看到打印信息的格式也是有規律的:
左側為caffe采用的GLOG庫內方法打印的信息,這個庫主要起記錄日志的功能,方便出現問題時查找根源,具體格式為:
[日期] [時間] [進程號] [文件名] [行號]
往右即為當前迭代次數以及損失值(訓練過程不輸出准確率accuracy)。
當迭代次數達到lenet_solver.prototxt定義的max_iter時,就可以認為訓練結束了。並且最終會在目錄\examples\mnist下產生訓練出的模型(文件后綴名為caffemodel和solverstate),如下圖所示:
分別是訓練至一半和訓練最終完成后的模型。接下來可以用這模型對mnist的測試集和自己手寫的數字進行測試(見下篇教程)。
五、結語
也許到目前為止你還是感覺caffe像個黑盒一樣,無法洞悉它的具體工作過程。但至少到這一步為止你已經完成了最初的caffe配置過程並成功利用mnist數據訓練出了第一個caffemodel。之后的東西雖然不能說簡單,但並沒有這最初的一步來得意義重大。完成了Step ZERO to ONE,就能飽含信心的繼續下去,進一步探究caffe(好像雞湯了?)。在接下來的教程中會用到該模型對mnist數據集以及你自己手寫的圖片進行測試。后者還是很有趣的。
六、參考
[1]深度學習21天實戰Caffe 趙永科 電子工業出版社
(雖然這本書由於大量地貼代碼,評價不是太好,但對初學者還是有很多可取之處的)
[2]http://m.blog.csdn.net/article/details?id=51355143
[3]Caffe官方教程中譯本 社區預覽版