首先是本身的實踐總結後面是轉載的別人的內容:html
在配置Matconvet時首先要配置MATLAB的編譯器,此時你就要查看你的MATLAB的版本支持的編譯器有哪些;兩個相匹配後,再把msvc120opts.bat文件拷到C:\Program Files\MATLAB\R2014a\bin\win64\mexopts下這樣你在MATLAB命令窗口中使用mex -setup c++命令就能檢測到你的電腦上的編譯器了,而後在機器學習\matconvnet-1.0-beta24目錄下建一個compile.m文件來測試,當出現MEX成功時,說明你成功了。而後把你要用的代碼文件放到c++
機器學習\matconvnet-1.0-beta24\examples目錄下就能成功運行了。web
轉載:http://blog.csdn.net/anysky___/article/details/51356158小程序
Introduction to Matconvnetwindows
MatConvNet是實現用於計算機視覺領域的卷積神經網絡(CNN)的MATLAB工具箱。自從取得突破性工做以來,CNN在計算機視覺領域有一個重大影響,特別是圖像理解,基本上取代了傳統圖像表示。有許多其餘機器學習、深度學習和CNN開源庫的存在。一些最受歡迎的:CudaConvNet ,Torch, Theano,Caffe等。MatConvNet是爲研究人員提供一個尤爲是友好和高效使用的環境,它其中包含許多CNN計算塊,如卷積,歸一化和池化等等,他們中的大部分是使用C++或CUDA編寫的,這意味着它容許使用者寫新的塊來提升計算效率。MatConvNet能夠學習AlexNet等大型深度CNN模型,這些強大的模型的Pre-trained版本能夠從MatConvNet主頁下載。雖然強大,可是MatConvNet易於使用和安裝。實現是徹底獨立的,只須要MATLAB和兼容的c++編譯器(使用GPU代碼免費提供CUDA DevKit和合適的NVIDIA GPU)。瀏覽器
[注]:我下載的版本是matconvnet-1.0-beta19,這個在能夠從MatConvNet主頁下載,下載網址以下:http://www.vlfeat.org/matconvnet/網絡
1、Getting started架構
編譯MatConvNet的CPU版本機器學習
首先經過一個簡單可是完整的例子看一下CNN是如何完成下載MatConvNet,編譯,下載pre-trained CNN 模型,完成MATLAB圖片分類的過程。代碼能夠從MatConvNet主頁的http://www.vlfeat.org/matconvnet/pretrained/得到。ide
注:一、untar('http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta20.tar.gz') 是下載安裝包的過程,建議單獨下載其ZIP包,解壓後放在任意位置,運行程序的時候會經過vl_setupnn()自動添加路徑到Matlab中。下載時最好使用瀏覽器內置的下載器,由於迅雷下載下來的是一個txt文件,還須要轉換。
二、run matlab/vl_compilenn是編譯的過程,前提是要求matlab與編譯器(VSc++)實現鏈接,若是沒有可使用mex -setup命令,設置matlab的C++編譯器,提示MEX成功,才能夠運行example中的示例。這個實際上就是配置Matconvnet的過程,只須要兩句話:mex -setup;run matlab/vl_compilenn
三、run matlab/vl_setupnn,這句話在運行時老是報錯,提示錯誤使用cd(固然上一句也可能出現這個問題,但我是直接運行的vl_compilenn,因此沒出現,嘿嘿),在這裏我將這句話改成run(fullfile(fileparts(mfilename('fullpath')),...
'..', 'matlab', 'vl_setupnn.m')) ,固然具體的語句與你所設的路徑有關,就沒有出現報錯了。
4.net = load('imagenet-vgg-f.mat')這裏net就是這個工具庫所須要的預訓練模型,在這裏面鏈式網絡已經架構完成,它的呈現形式是一個結構體,包括兩部分,layers(由於這個結構有21層,故包含21個元胞)和meta(包含2個結構體,類別和標準化信息)。
五、程序的主體代碼爲vl_simplenn,包括CNN網絡的輸入輸出及調用函數的過程。
編譯MatConvNet的GPU版本
在GPU條件下編譯,首先你的顯卡得是INVIDA的,而且須要compute compability>2.0,其次必定要考慮版本相互協調的問題,我使用的版本是window7 65bits,vs2013,cuda7.5,MATLAB2014a,顯卡是GTX960,compute compability=5.2,關於顯卡是否合乎要求,也能夠經過下載軟件GPU Caps Viewer查看。
編譯MatConvNet的GPU版本的具體步驟以下:
(1)官網下載CUDA 7.5.1八、 以及 CUDA_Quick_Start_Guide.pdf,CUDA Toolkit 7.5.18 下載地址:http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_windows.exe
(2) 直接解壓安裝,建議採用默認安裝的方式,方便MatConvNet按默認方式找到CUDA 編譯器‘nvcc’。關於cuda與vs的具體配置,能夠參考http://blog.csdn.net/listening5/article/details/50240147和http://www.cnblogs.com/shengshengwang/p/5139245.html
(3) 完成後打開 cuda samples 文件夾下 Samples_vs2013.sln 分別在DEBUG 和Release X64下進行完整編譯。編譯過程如提示找不到」d3dx9.h」、」d3dx10.h」、」d3dx11.h」頭文件,則百度下載DXSDK_Jun10.exe並安裝。下載網址http://www.microsoft.com/en-us/download/details.aspx?id=6812 以後再從新編譯。
(4) 所有編譯成功以後,打開CUDA Samples 文件夾下的 bin/win64/release ,以下圖。運行其中的小程序,便可查看GPU CUDA信息。PASS 爲經過。
(5)安裝cudnn-win64-v4.0/or-v3.0,下載網址http://download.csdn.net/download/yfszzx/9307683直接解壓到某文件夾下,將cudnn64_4.dll 文件拷貝到 ./matconvnet/Matlab/mex文件夾下便可。
(6)編譯vl_compilenn程序,注意根據實際狀況修改一些信息,大體調用方式爲vl_compilenn('enableGpu',true,,'cudaMethod' ,'nvcc','enableCudnn','true','cudnnRoot','local/cuda),提示mex成功,則證實工做完成一大半了。
(7)最後就是運行cnn_cifa.m文件,運行前將程序中 opts.gpuDevice =[]改成opts.gpuDevice =[1];表示使用GPU顯卡運行,運行結果如圖
可見速度是至關快的!
接下來咱們介紹一下這個工具庫中的一些計算函數,方便你們理解。
Conputationnal blocks:實現cnn的計算塊 1、卷積
Y = VL_NNCONV(X, F, B)計算圖像堆x的卷積,F是卷積核,B是偏置。X=H*W*D*N, (H,W)是圖像的高和寬,D是圖像深度(特徵頻道的數目,例彩色就是3),N是堆中圖像的數目。F=FW*FH*FD*K ,(FH,FW)是卷積核的大小,FD是卷積核的深度,須與D一致,或能整除D,K是卷積核的數目。針對一幅圖像來講,卷積的公式爲:
其中ij分別表明圖像的高和寬,d」則表明了卷積核的數目,從而對應d」個輸出。 [DZDX, DZDF, DZDB] = VL_NNCONV(X, F, B, DZDY)計算映射到DZDY上的塊的導數。這是反向傳播中應用的梯度計算公式。 另外還有一些具體的變量設置。包括Stride=(sh,sw)是步長,即在卷積過程當中每次移動的大小,這也決定了最後輸出的大小,pad是補0的大小,表示爲:
則最終輸出的大小爲:
[注]:一、在Matconvnet中並不區分全鏈接層和卷積層,而認爲前者是後者的一種特殊狀況。
二、在Matconvnet中有Filter groups(即濾波組)的概念,意思是說vl_nnconv容許對輸入x的通道進行分組,且每組應用不一樣子集的過濾器。groups=D/D',D是圖像深度,D'是濾波器的深度,從而第一組可包括輸入的一、2,,,D'維度,第二組包括輸入的D'+1,,,2D',以此類推,但輸出的大小是不變的。
2、卷積轉換(反捲積)
Y = VL_NNCONVT(X, F, B)計算CNN的卷積轉換,即進行卷積的反操做,其輸入輸出形式與上同。因爲卷積支持輸入補0輸出進行下采樣,所以反捲積支持輸入上採樣輸出裁剪。
3、空間池化
Y = VL_NNPOOL(X, POOL)或Y = VL_NNPOOL(X, [POOLY, POOLX])對輸入x的每一個通道進行池化操做,池化的方式能夠是求patch的最大值或平均值。同卷積相同,池化也支持pad和Stride操做,但pad有時是補負無窮。
4、激活函數
RELU函數:y = vl_nnrelu(x,dzdy,varargin),在leak=0時,表達式爲
Sigmoid函數:out = vl_nnsigmoid(x,dzdy)
這裏只給出了正向傳播時的函數表達式,反向傳播的(涉及dzdy)具體表達式能夠看程序。
5、歸一化
一、VL_NNNORMALIZE :CNN Local Response Normalization (LRN)
Local Response Normalization是對一個局部的輸入區域進行的歸一化,從表達式來看,也就是對每個groups(前文)裏的輸入的相應子集進行歸一化。表達式以下;其中的參數包括PARAM = [N KAPPA ALPHA BETA]
其中G(k)是對應通道k的輸入相應子集,在程序中定義爲 Q(k) = [max(1, k-FLOOR((N-1)/2)), min(D, k+CEIL((N-1)/2))];
二、VL_NNBNORM CNN 實現批次歸一化
Y = VL_NNBNORM(X,G,B),這裏XY均是4維張量,第4維T表示每批次處理的大小。標準化的表達式爲
3.VL_NNSPNORM實現空間歸一化 y = vl_nnspnorm(x, param, dzdy),PARAM = [PH PW ALPHA BETA];即對每一個通道先進行池化操做,池化的方式爲取平均,而後在進行歸一化操做。其表達式爲
四、VL_NNSOFTMAX CNN softmax
Y = vl_nnsoftmax(X,dzdY):在一個groups(前文)中應用softmax函數,softmax函數能夠看作一個激活函數和一個歸一化操做的聯合
6、損失和比較
一、 [y1, y2] = vl_nnpdist(x, x0, p, varargin)計算每一個向量x與目標x0之間的距離,定義爲:
2. Y = vl_nnloss(X,c,dzdy,varargin)