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)

相关文章
相关标签/搜索