参考网址:http://www.vlfeat.org/matconvnet/

内容参考博客:http://blog.sina.com.cn/s/blog_92cd3a1c0102x1ch.html

MatConvNet安装:http://www.vlfeat.org/matconvnet/install/ (根据自己的系统配置进行相应的安装)

摘要

  MatConvnet是用matlab实现的卷积神经网络(CNN),该工具箱的设计注重简洁性和灵活性。它将CNN的构建模块公开为易于使用的MATLAB函数,提供用于计算带有滤波器组的线性卷积、特征池化等例程。通过这种方式,MatConvNet可以快速建立新的CNN结构;同时,它支持CPU和GPU上的高效计算,允许在大型数据集(如ImageNet ILSVRC)上训练复杂模型。本文档概述了CNN及其在MatConvNet中如何实现,并给出了工具箱中每个计算模块的技术细节。

第一章 MatConvnet介绍

  MatConvNet是一个实现卷积神经网络(CNN)的MATLAB工具箱,用于计算机视觉应用。自从工作[8]的突破,CNNs在计算机视觉领域产生了重大影响,特别是在图像理解方面,基本上是取代传统的图像表示,例如在我们自己的VLFeat [13]中实现的开源库。

  虽然大多数CNN是通过组合简单的线性和非线性滤波操作(例如卷积和整形)来获得的,但是它们的实现是非常重要的。原因是为了获得非常有效的实现,CNNs需要从大量的数据中学习,经常是数百万的图像。作为大多数CNN库,MatConvNet通过使用各种优化来实现这一点,主要是通过支持GPU上的计算。

  除此之外,还有许多其他的机器学习,深度学习和CNN开源库存在。引用其中一些最受欢迎的:CudaConvNet(https://code.google.com/p/cuda-convnet/)、Torch(http://cilvr.nyu.edu/doku.php?id=code:start)、Theano(http://deeplearning.net/software/theano/)以及caffe(http://caffe.berkeleyvision.org)。这些库中许多得到很好的支持,有几十个活跃的贡献者和大量的用户基础。因此,为什么还要创建另外一个库呢?

  开发MatConvNet的关键动机是为研究人员提供一个特别友好和有效的环境,以便在其调查中使用。MatConvnet通过其在MATLAB环境中的深度集成实现了这一点,这是计算机视觉研究以及许多其他领域最受欢迎的开发环境之一。特别是,MatConvNet公开了简单的MATLAB命令来实现CNN构建块,如卷积,归一化和池化(第4章);这些块可以很容易地组合和扩展以创建CNN结构。虽然许多这样的块使用用C ++和CUDA编写的优化的CPU和GPU实现(第1.4节)。 MATLAB本机支持GPU计算意味着通常在MATLAB中直接写入新的模块是可能的,同时保持计算效率。与使用低级语言编写新的CNN组成结构相比,这是一个重要的简化,可以显着加速测试新的想法。使用MATLAB还提供了一个到其他领域的桥梁; 例如,MatConvNet最近被亚利桑那大学用于行星科学,如NVIDIA博客网站所述。

  MatConvNet可以从输完图片中学习大的CNN模型,如AlexNet[8]和非常深的网络[11]。可以从MatConvNet主页下载这些强大模型的预训练版本。虽然功能强大,但是MatConvNet仍然很容易使用和安装。实现是完全独立的,只需要MATLAB和兼容的C ++编译器(使用GPU代码需要免费提供的CUDA开发套件和合适的NVIDIA GPU)。如图 1.1和第1.1节所示,可以使用三个MATLAB命令下载,编译和安装MatConvNet。其中包括了几个完整功能的示例,演示如何可以学习小型和大型网络。重要的是,几个标准的预训练网络可以立即下载并在应用程序中使用。该工具箱的完整技术说明手册也包含在此工具箱中。这些功能使MatConvNet在教育领域也很有用。

  MatConvNet是根据BSD类似许可证开放源代码。可从http://www.vlfeat.org/matconvnet以及GitHub上下载。

1.1 开始运行

  MatConvNet易于安装和使用。图1.1提供了一个完整的示例,即使用最新一代的卷积神经网络来对一张图片进行分类。该示例包含下载MatConvNet,编译包,下载一个预训练的CNN模型,以及在MATLAB的某个库存图像上评估该模型。

  在这个例子中的关键命令是vl_simplenn,一个包装器,它将CNN网络和预处理图像im_作为输入,并产生结果的结构res。该特定封装可以用于对具有简单结构,即操作链的网络建模。 检查vl_simplenn(在MatConvNet中编辑vl_simplenn)的代码,我们注意到封装顺序地转换数据,应用网络配置指定的多个MATLAB函数。 这些函数,在第4章中详细讨论,被称为“构建块”,并构成MatConvNet的骨架。

  虽然大多数块实现简单的操作,但使得它们不平凡的是它们的效率(第1.4节)以及支持反向传播(第2.3节),以允许学习CNN。接下来,我们演示如何直接使用这样的构建块之一。 为了示例的目的,考虑使用一组线性滤波器对图像进行卷积。 首先,通过在MATLAB中读取图像,例如使用im = single(imread('peppers.png')),获得H×W×D数组im,其中D = 3是图像中的颜色通道的数量。 然后使用f = randn(3,3,3,16,'single')创建一个大小为3×3的K = 16个随机滤波器组。最后,使用命令y = vl_nnconv(x,f,[])将图像与滤波器进行卷积。 这产生了具有K个通道的阵列y,滤波器组中的每一个在阵列中都有一个通道。

  为了鼓励用户直接使用块来创建新的架构,MATLAB提供了封装,如vl_simplenn用于标准CNN结构,如AlexNet [8]或Network-in-Network [9]。  此外,库提供了许多示例(在examples /子目录中),包含了在MNIST,CIFAR和ImageNet数据集上学习各种模型的代码。所有这些示例使用examples / cnn_train训练代码,它是随机梯度下降的实现(第3.3节)。  虽然这个训练代码是完全可维护的和相当灵活的,它仍然在examples/子目录,因为它有点问题特定。欢迎用户对他们的实施优化。

(注:运行下列代码之前,需按照http://www.vlfeat.org/matconvnet/install/#compiling 所述通过编译。)

  1. % install and compile MatConvNet (run once)
  2. untar(['http://www.vlfeat.org/matconvnet/download/' ...
  3. 'matconvnet-1.0-beta25.tar.gz']) ;
  4. cd matconvnet-1.0-beta25
  5. run matlab/vl_compilenn
  6.  
  7. % download a pre?trained CNN from the web (run once)
  8. urlwrite(...
  9. 'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...
  10. 'imagenet-vgg-f.mat') ;
  11. % setup MatConvNet
  12. run matlab/vl_setupnn
  13. % load the pre?trained CNN
  14. net = load('imagenet-vgg-f.mat') ;
  15. % load and preprocess an image
  16. im = imread('peppers.png') ;
  17. im_ = imresize(single(im), net.meta.normalization.imageSize(:)) ;
  18. im_ = im_ - net.meta.normalization.averageImage ;
  19. % run the CNN
  20. res = vl_simplenn(net, im_) ;
  21. % show the classification result
  22. scores = squeeze(gather(res(end).x)) ;
  23. [bestScore, best] = max(scores) ;
  24. figure() ; clf ; imagesc(im) ;
  25. title(sprintf('%s (%d), score %.3f',...
  26. net.meta.classes.description{best}, best, bestScore)) ; %%注:官方代码是net.classes.description,需要加上meta

运行结果如下:

 1.2 MatConvNet概览

  MatConvNet有一个简单的设计原则。它不是将CNN包裹在软件的复杂层上,而是开放了直接作为MATLAB命令的计算CNN模块的简单函数,例如线性卷积和ReLU操作。这些模块易于组合成完整的CNN,并且可以用于实现复杂的学习算法。虽然提供了小型和大型CNN结构和预训练例程的几个实际例子,但总是可以回到基础并构建自己的结构,使用MATLAB在原型中的效率。通常不需要C编码来尝试新的结构。因此,MatConvNet是计算机视觉和CNNs研究的理想平台。

  MatConvNet包含了以下元素:

  CNN计算块 一组计算CNN的基本模块的优化例程。例如,卷积模块是由y = vl_nnconv(x,f,b)实现,其中x是图像,f是滤波器组,b是偏置矢量(第4.1节)。导数可由[dzdx,dzdf,dzdb] = vl_nnconv(x,f,b,dzdy)计算,其中dzdy是CNN输出w.r.t y的导数(第4.1节)。第4章详细描述了所有块。

  CNN封装. MatConvNet提供了一个简单的封装,由vl_simplenn调用,其实现具有线性拓扑(块链块)的CNN。 它还提供了一个更灵活的封装,支持具有任意拓扑的网络,封装在dagnn.DagNN
MATLAB类中。

  示例应用程序.MatConvNet提供了几个在MNIST,CIFAR 10和ImageNet数据集上学习具有随机梯度下降和CPU或GPU的CNN的示例。

  预先训练的模型.MatConvNet提供了几个先进的预训练的CNN模型,可以使用现成的,以分类图像或者在Caffe或DeCAF环境中生成图像编码。

1.3 文档和示例

  有三个关于MatConvNet的主要信息来源:
  首先,网站包含所有功能的描述和若干例子和教程。
  第二,有一个PDF手册,其中包含大量有关工具箱的技术细节,包括对构建块的详细数学描述。
  第三,MatConvNet附有几个例子(第1.1节)。

  大多数示例是完全自包含的。例如,为了运行MNIST示例,它支持将MATLAB指向MatConvNet根目录,并键入addpath←examples,后跟cnn_mnist。根据问题的大小,Image
Net ILSVRC示例需要一些更多准备,包括下载和预处理图像(使用附带的脚本utils / preprocess-imagenet.sh)。还包括几个高级示例。例如, 图1.2说明了top-1和top-5验证错误,因为类似于Alex Net
[8]的模型使用标准dropout正规化或最近的批次标准化技术[3]进行训练。后者被示为在前者所需的约三分之一的epochs(通过训练数据)中收敛。

  MatConvNet网站还包含许多预训练模型,即在Image Net
ILSVRC上训练的大型CNN,可以下载并用作许多其他问题的起点[1]。 这些包括:AlexNet
[7],VGG-S,VGG-M,VGG-S [1]和VGG-VD-16和VGG-VD-19
[11]。图1.1的示例代码显示了一个这样的模型如何在几行MATLAB代码中使用。

1.4 速度

  效率对于CNN的工作非常重要。 MatConvNet支持使用NVIDIA GPU,因为它包括所有算法的CUDA实现(或依赖于MATLAB CUDA支持)。

  要使用GPU(假设有合适的硬件可用,并且工具箱已经在GPU支持下编译),只需要在MATLAB中将参数转换为gpuArrays,如y = vl_nnconv(gpu Array(x),gpu Array(w),[])。以这种方式,CPU和GPU之间的切换是完全透明的。 请注意,MatConvNet还可以利用NVIDIA CuDNN库,具有显着的速度和空间优势。

  接下来,我们评估MatConvNet在Image Net ILSVRC 2012挑战数据上训练大型架构时的性能[2]。测试机器是一台戴尔服务器,配有两个采用3.30 GHz时钟频率的Intel Xeon CPU E5-2667 v2(每个CPU有八个内核),256 GB RAM和四个NVIDIA Titan Black GPU(除非另有说明,否则只使用其中一个) 。实验使用MatConvNet beta12,Cu DNN v2和MATLAB R2015a。数据被预处理以避免在MATLAB中飞快地重新缩放图像并存储在RAM盘中以便更快地访问。该代码使用vl_imreadjpeg命令在多个单独的线程中从磁盘读取大批量的JPEG图像。驱动程序examples/ cnn_imagenet.m用于所有实验。

我们训练在Image Net ILSVRC第1.3节中讨论的模型。表1.1报告了随机梯度下降处理的每秒图像数量的训练速度。 Alex Net以大约264张图像/ s使用Cu DNN进行训练,这比使用Cu BLAS的vanilla GPU实现快40%,比使用CPU快10多倍。此外,我们注意到,尽管MATLAB开销,实现速度与Caffe相当(他们报告Cu DNN和Titan每秒253图像 - 一个比这里使用的Titan  Black略慢的GPU)。还要注意,随着模型大小的增加,SGD批次的大小必须减小(以适应GPU内存),从而增加了开销影响。

表1.2报告了使用多个GPU的VGG-VD-16(一个非常大的模型)的速度。在这种情况下,批量大小设置为264个图像。这些被进一步划分为22个图像的子批次,每个图像适合于GPU存储器;然后将后者分布在同一机器上的一至四个GPU中。虽然存在大量的通信开销,但是训练速度从20个图像/秒增加到45.解决这个开销是代码库的中期目标之一。

1.5 致谢

  MatConvNet是一个社区项目,因此感谢所有的贡献者。我们衷心感谢NVIDIA为此项目提供支持,为我们提供了顶级的GPU和MathWorks,以便持续讨论如何改进库。
在这个库中的几个CNN计算的实现灵感来自Caffe库[6](然而,并不依赖于Caffe)。 几个示例网络已经由Karen
Simonyan作为[1]和[11]的一部分拿来训练。

Matconvnet笔记(一)的更多相关文章

  1. [深度学习][图像处理][毕设][笔记][安装环境][下载地址]安装VS2013、matconvnet、cuda、cudnn过程中产生的一些记录,2018.5.6号

    最近半个多月,被cuda等软件折磨的死去活来,昨天下午,终于安装好了环境,趁着matlab正在,在线下载VOT2016数据集,3点睡眼惺忪被闹醒后,睡不着,爬上来写这份记录. 先记录一下自己电脑的基本 ...

  2. MatConvNet 练习使用CNN

    首先在 VGG Convolutional Neural Networks Practical 官网上做了四个练习.现在代码可以直接用 但是在using pretrained models中有个错,n ...

  3. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

  9. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

随机推荐

  1. POJ 1704 Georgia and Bob(阶梯Nim博弈)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11357   Accepted: 3749 Description Geor ...

  2. 前端了解即可:OSS客户端如何使用,以实现资源分离

    前一阵,应为项目需要,才简单整理了一下oss客户端的使用,做静态资源分离,及在项目中引入路径.接下来讲解记录一下,阿里云对象存储(Object Storage Service,简称OSS)客户端的基础 ...

  3. [Intellij] 在IntelliJ IDEA 中创建运行web项目

    安装工具 1.JDK7+ 2.IntelliJ Idea 工具(下载安装后,网上找注册码破解即可) 3.tomcat7+ 解压缩版 明确两个概念: 1.Project:类似于eclipse的works ...

  4. Python入门基础之迭代和列表生成式

    什么是迭代 在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration). 在Python中,迭代是通过 for ...

  5. Tomcat映射虚拟路径到指定磁盘(eclipse)

    用WangEditor富文本编辑,上传图片的时候,本文主要记录一下Tomcat映射虚拟路径到指定磁盘,保存到指定路径中,且能实现页面预览. 在实现之前wangeditor的简单实用请参照博主小道仙的后 ...

  6. gitlab runner安装与使用

    今天来讲一下如何使用gitlab-runner 下载runner,根据自己对应服务器的型号自行选择下载: # Linux x86- sudo wget -O /usr/local/bin/gitlab ...

  7. MySQL 安装及卸载详细教程

    本文采用最新版MySQL8版本作为安装教程演示,本人亲试过程,准确无误.可供读者参考. 下载 官网下载 --> 社区免费服务版下载. 下载Windows安装程序MySQL Installer M ...

  8. linux 下svn操作

    * 前言: linux下的svn相比于gitlab,配置要求第一点:gitlab需要4G的内存,如果使用swap+内存的替代方案,理论上是可行的,但是实际操作中各种坑:     所以,由于条件限制,使 ...

  9. Nginx 出现 403 Forbidden 最终解决

    Nginx 出现 403 Forbidden 最终解决 步骤一: 检查目录权限.权限不足的就加个权限吧. 例子:chmod -R 755 / var/www 步骤二: 打开nginx.conf 例子: ...

  10. 【公众号系列】SAP S/4 HANA 1809请查收

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP S/4 HANA 1809 ...