Matconvnet学习笔记

article/2025/8/18 3:51:30

Introduction to Matconvnet

  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/

  一、Getting started

  编译MatConvNet的CPU版本

  首先通过一个简单但是完整的例子看一下CNN是如何完成下载MatConvNet,编译,下载pre-trained CNN 模型,完成MATLAB图片分类的过程。代码可以从MatConvNet主页的http://www.vlfeat.org/matconvnet/pretrained/获得。

 
  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));

  注:1、untar('http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta20.tar.gz') 是下载安装包的过程,建议单独下载其ZIP包,解压后放在任意位置,运行程序的时候会通过vl_setupnn()自动添加路径到Matlab中。下载时最好使用浏览器内置的下载器,因为迅雷下载下来的是一个txt文件,还需要转换。

    2、run matlab/vl_compilenn是编译的过程,前提是要求matlab与编译器(VSc++)实现连接,如果没有可以使用mex -setup命令,设置matlab的C++编译器,提示MEX成功,才可以运行example中的示例。这个实际上就是配置Matconvnet的过程,只需要两句话:mex -setup;run matlab/vl_compilenn

    3、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个结构体,类别和标准化信息)。

    5、程序的主体代码为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.18、 以及 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的计算块
  一、卷积

  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的大小,表示为:


则最终输出的大小为:

  [注]:1、在Matconvnet中并不区分全连接层和卷积层,而认为前者是后者的一种特殊情况。

     2、在Matconvnet中有Filter groups(即滤波组)的概念,意思是说vl_nnconv允许对输入x的通道进行分组,且每组应用不同子集的过滤器。groups=D/D',D是图像深度,D'是滤波器的深度,从而第一组可包括输入的1、2,,,D'维度,第二组包括输入的D'+1,,,2D',以此类推,但输出的大小是不变的。

  二、卷积转换(反卷积)

  Y = VL_NNCONVT(X, F, B)计算CNN的卷积转换,即进行卷积的反操作,其输入输出形式与上同。由于卷积支持输入补0输出进行下采样,因此反卷积支持输入上采样输出裁剪。

  三、空间池化

  Y = VL_NNPOOL(X, POOL)或Y = VL_NNPOOL(X, [POOLY, POOLX])对输入x的每个通道进行池化操作,池化的方式可以是求patch的最大值或平均值。同卷积相同,池化也支持pad和Stride操作,但pad有时是补负无穷。

  四、激活函数

  RELU函数:y = vl_nnrelu(x,dzdy,varargin),在leak=0时,表达式为

  Sigmoid函数:out = vl_nnsigmoid(x,dzdy)

  这里只给出了正向传播时的函数表达式,反向传播的(涉及dzdy)具体表达式可以看程序。

  五、归一化

  1、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))];

  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];即对每个通道先进行池化操作,池化的方式为取平均,然后在进行归一化操作。其表达式为

  4、VL_NNSOFTMAX CNN softmax

  Y = vl_nnsoftmax(X,dzdY):在一个groups(前文)中应用softmax函数,softmax函数可以看做一个激活函数和一个归一化操作的联合

   六、损失和比较

  1、 [y1, y2] = vl_nnpdist(x, x0, p, varargin)计算每个向量x与目标x0之间的距离,定义为:

  2. Y = vl_nnloss(X,c,dzdy,varargin)

 

 

 

原文链接:https://blog.csdn.net/Anysky___/article/details/51356158

  
 

 


http://chatgpt.dhexx.cn/article/TcNDkYfn.shtml

相关文章

20190812_解决anaconda下install库的问题

20190812_解决anaconda下install库的问题 一、起因二、开始解决三、解决方法1 创建虚拟环境2 在环境中安装库3 重新配置pycharm中的解释器4 运行5 其他 一、起因 在学习PYQT5例子时,需要在anaconda下使用plotly库 二、开始解决 使用: conda install …

matlab已停止工作 win7 64,win7系统笔记本运行软件弹出“Matlab已停止工作”的解决方法...

很多小伙伴都遇到过win7系统笔记本运行软件弹出“Matlab已停止工作”的困惑吧,一些朋友看过网上零散的win7系统笔记本运行软件弹出“Matlab已停止工作”的处理方法,并没有完完全全明白win7系统笔记本运行软件弹出“Matlab已停止工作”是如何解决的&#…

Map遍历方法及效率

在大学的时候记得学过通过迭代器进行Map的遍历,但是从参加工作后,基本都是通过for循环遍历,没用过迭代器,于是去了解了Map的几种遍历方法并通过运行测试各自的速度。 注意:这里只讲通过遍历同时能过获取key和value的遍…

java map集合如何遍历效率高 java中Map遍历的方式

java map集合如何遍历效率高 java中Map遍历的方式 一、前言 1、在看 《阿里巴巴java开发手册》时候,有一条推荐的规约: 【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次&#xff0c…

【Java】Map遍历key-value的四种方法

Map遍历key-value的四种方法 (1)先用keySet()取出所有key值,再取出对应value——增强for循环遍历 (2)先用keySet()取出所有key值,再取出对应value——使用迭代器遍历 (3)通过entryS…

SVM——核函数

我们知道,SVM相对感知机而言,它可以解决线性不可分的问题,那么它是怎么解决的呢?它的解决思想很简单,就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分&#xff0c…

SVM核函数概述

特征空间的隐式映射:核函数 咱们首先给出核函数的来头:在上文中,我们已经了解到了SVM处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间&#x…

聚类算法之核函数

一:监督学习与无监督学习 1,监督学习 监督学习就是人们常说的分类,通过训练已有样本得到一个最优模型,利用该模型将输入转化成输出,对输出进行判断,从而实现分类,也就是具有了对未知数据进行分类…

svm核函数的理解和选择

特征空间的隐式映射:核函数 咱们首先给出核函数的来头:在上文中,我们已经了解到了SVM处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间&#x…

matlab rbf核函数,四类核函数(Sigmoid+RBF)

Q:有个疑问就是,模型本身不是线性的,为什么一定要先用线性模型做? A:有核函数和泰勒展开等等,可以无限逼近转化成线性? 小知识: 1.Sigmoid函数,即f(x)=1/(1+e-x)。是神经元的非线性作用函数。广泛应用在神经网络中。又叫Logistic函数。 机器学习中一个重要的预测模型逻辑…

SVM的核函数详解

文章目录 1、核函数背景核函数正式定义 2、高斯核函数2.2 参数带宽 σ \sigma σ的影响2.3高斯核函数的实际意义 2、多项式核函数4、参考资料 1、核函数背景 本文为核函数进阶教程,希望看文章之前最好对核函数有一些最基本的了解,不然有些地方可能会看不…

常见核函数

这篇博文开始的例子就很好地揭示了核函数的简单原理,写得很好! 原地址:https://blog.csdn.net/zkq_1986/article/details/52448238 1 核函数K(kernel function)定义 核函数K(kernel function)就…

CUDA核函数

核函数是指在GPU端运行的代码,核函数内部主要干了什么?简而言之,就是规定GPU的各个线程访问哪个数据并执行什么计算。 文章目录 一、CUDA规范二、核函数内部线程的使用2.1 如何启动核函数 一、CUDA规范 编写核函数必须遵循CUDA规范&#xff…

SVM与核函数

文章目录 核技巧与SVM核函数本质线性可分的SVM与硬间隔最大化SVM对偶算法核技巧高斯核多种不同的核函数比较soft margin 问题核函数 核函数 核技巧与SVM SVM原本是用来解决二分类的分类模型 它和感知机不同的一点是它取到的分类器是在特征空间上的最大间隔的分类器 而为了解决…

核函数(核技巧)

核技巧Kernel trick 背景及含义: 对于 原始样本空间内或许不存在能正确划分两类样本的超平面 问题,考虑 将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。 令 ϕ ( x ) \phi(x) ϕ(x)表示将x映射后的特征向量…

了解核函数

1、核函数定义: 核函数包括线性核函数、多项式核函数、高斯核函数等,其中高斯核函数最常用,可以将数据映射到无穷维,也叫做径向基函数(Radial Basis Function 简称 RBF),是某种沿径向对称的标量…

核函数

对于优化问题: 的求解需要计算这个内积,而如果输入样本线性不可分的话,我们采取的方法是通过函数映射将输入样本映射到另外一个高维空间并使其线性可分。 以库克定律为例(http://zh.wikipedia.org/zh-cn/%E9%9D%99%E7%94%B5%E5%8A%9B)&#x…

什么是核函数?如何理解?

个人理解,核函数的功能就是从低维度的空间向高维度空间转换的函数, 因为在低维空间不可以线性分类的问题到高维度空间就可以线性分类的。 其求法为 低维空间的点映射到高维空间的点后,两个点的内积 就是核函数。 ~~~~~~~~~~~~~~~~~~~~~~~~…

你知道什么是核函数吗

目录 一、常用核函数:二、核函数特点:三、选择核函数的方法:四、核函数方法实施步骤:五、核函数在模式识别中的应用:六、核函数方法原理: 核函数K(kernel function)就是指K(x, y) &…

kernel核函数是什么、用来干什么 及其详细推导

在说核函数之前,我们先说说映射及其作用. 如果在当前空间对数据类别不好使用线性函数进行划分,则通过一个函数φ( x)将数据点从当前空间映射到另一空间去(映射后的空间叫特征空间,通常是更高维的空间,当然不是绝对)以方…