Matconvet的學習筆記

首先是本身的實踐總結後面是轉載的別人的內容: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

[csharp]  view plain copy
 
  1. % install and compile MatConvNet (needed once)  
  2. untar('http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta20.tar.gz') ;  
  3. cd matconvnet-1.0-beta20  
  4. run matlab/vl_compilenn  
  5.   
  6. % download a pre-trained CNN from the web (needed once)  
  7. urlwrite(...  
  8.   'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...  
  9.   'imagenet-vgg-f.mat') ;  
  10.   
  11. % setup MatConvNet  
  12. run  matlab/vl_setupnn  
  13.   
  14. % load the pre-trained CNN  
  15. net = load('imagenet-vgg-f.mat') ;  
  16. net = vl_simplenn_tidy(net) ;  
  17.   
  18. % load and preprocess an image  
  19. im = imread('peppers.png') ;  
  20. im_ = single(im) ; % note: 0-255 range  
  21. im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;  
  22. im_ = bsxfun(@minus, im_, net.meta.normalization.averageImage) ;  
  23.   
  24. % run the CNN  
  25. res = vl_simplenn(net, im_) ;  
  26.   
  27. % show the classification result  
  28. scores = squeeze(gather(res(end).x)) ;  
  29. [bestScore, best] = max(scores) ;  
  30. figure(1) ; clf ; imagesc(im) ;  
  31. title(sprintf('%s (%d), score %.3f',...  
  32. net.meta.classes.description{best}, best, bestScore));  

  注:一、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/50240147http://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)

相關文章
相關標籤/搜索