参考网址: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 所述通过编译。)

 % install and compile MatConvNet (run once)
untar(['http://www.vlfeat.org/matconvnet/download/' ...
'matconvnet-1.0-beta25.tar.gz']) ;
cd matconvnet-1.0-beta25
run matlab/vl_compilenn % download a pre?trained CNN from the web (run once)
urlwrite(...
'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...
'imagenet-vgg-f.mat') ;
% setup MatConvNet
run matlab/vl_setupnn
% load the pre?trained CNN
net = load('imagenet-vgg-f.mat') ;
% load and preprocess an image
im = imread('peppers.png') ;
im_ = imresize(single(im), net.meta.normalization.imageSize(:)) ;
im_ = im_ - net.meta.normalization.averageImage ;
% run the CNN
res = vl_simplenn(net, im_) ;
% show the classification result
scores = squeeze(gather(res(end).x)) ;
[bestScore, best] = max(scores) ;
figure() ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',...
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. Vue+axios统一接口管理

    通过axios请求接口已经很简单了,但最近在做一个vue项目,想着把axios请求再封装一下,这样api就可以只在一处配置成方法,在使用的时候直接调用这个方法. 但咱们不用每个接口都定义成一个啰嗦的a ...

  2. @Tranactional 注解分析

    Spring可以通过注解@Transactional来为业务逻辑层的方法(调用DAO完成持久化动作)添加事务能力,如下是@Transactional注解的定义 @Tranactional注解分析 作用 ...

  3. How To Do Master Record Mass Maintenance

    How To Do Master Record Mass Maintenance Which master records mass maintenance can be done? What do ...

  4. mysql中需要注意的编码问题

  5. Mac上一条命令搭建web服务器

    实际测试工作中偶尔会需要搭建Web服务器环境,由于Mac OS X自带了Apache和PHP环境,只需要简单的启动就可以. 开启Apache 开启Web服务器的方法有两种(默认启动端口号是80): 打 ...

  6. Linux 无线网卡配置

    无线网卡常见的配置选项 某TL-WR842N路由器无线配置选项含义: 无线名称 路由器的无线(Wi-Fi)名称.无线密码 无线加密使用WPA2-PSK/WPA-PSK加密方式.AES加密算法,无线密码 ...

  7. 任意activity作为启动页

    在androidManifest.xml中对应的activity中添加 android:exported=“true”

  8. OAF--基础

    OAF是WEB界面,FORM是由JDK将FORM里面的东西插入到HTML UI里的: OAF由 Oracle Business Components for JAVA(BC4J)框架作为其模型部分,完 ...

  9. ASP.NET MVC从视图传参到控制器的几种形式

    1. 传递数组 $(function () { var value = ["C#", "JAVA", "PHP"]; $("inp ...

  10. Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

    今天在用一键安装mysql的shell脚本安装mysql-5.1.73软件后发现mysql始终无法启动,多次执行后依旧报错,只能去查看error日志,发现了如下的2个错误: 错误一:Fatal err ...