Matconvnet笔记(一)
参考网址: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笔记(一)的更多相关文章
- [深度学习][图像处理][毕设][笔记][安装环境][下载地址]安装VS2013、matconvnet、cuda、cudnn过程中产生的一些记录,2018.5.6号
最近半个多月,被cuda等软件折磨的死去活来,昨天下午,终于安装好了环境,趁着matlab正在,在线下载VOT2016数据集,3点睡眼惺忪被闹醒后,睡不着,爬上来写这份记录. 先记录一下自己电脑的基本 ...
- MatConvNet 练习使用CNN
首先在 VGG Convolutional Neural Networks Practical 官网上做了四个练习.现在代码可以直接用 但是在using pretrained models中有个错,n ...
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
- springMVC学习笔记--知识点总结1
以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...
随机推荐
- [笔记]JavaScript 秘密花园
1.hasOwnProperty相关 为了判断一个对象是否包含自定义属性而不是原型链上的属性,我们需要使用继承自 Object.prototype 的 hasOwnProperty方法.hasOwnP ...
- Android图片采样缩放
为什么要对Android中的图片进行采样缩放呢? 是为了更加高效的加载Bitmap.假设通过imageView来显示图片,很多时候ImageView并没有图片的原始尺寸那么大,这时候把整张图片加载进来 ...
- 电脑端支付宝支付 -前端获取支付宝返回的form 以及submit 调用支付扫码页面
前端调取支付宝支付接口(后台进行封装,没有直接调取支付宝接口),调用返回的数据中,将会有一串的form表单数据返回,我们需要将此表单在当前调用页面submit下,以跳转到支付扫码页: 支付宝返回的fo ...
- 章节四、2-Switch语句
package introduction5; public class SwitchDemo { //switch用于固定值的判断,如星期.人的性别 //if用于判断区间.范围,能够用switch进行 ...
- jsp笔记----jsp常用的的获取项目的根路径
<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" ...
- A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No Java virtual machine was found after searching the following locations: /usr/local/eclipse/
linux系统下jdk是已经安装好的情况之下软件出现 A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be av ...
- 【转载】ubuntu下/usr/bin和/usr/local/bin的区别
这篇文章已经无法考证是谁原创的了 首先注意usr 指 Unix System Resource,而不是User 然后通常: /usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变. /u ...
- Java高级教程
目录 1.Java面向对象方法 1.1. 创建类和对象的方法 1.2. this的使用 1.3. 静态域和静态方法 1.3.1. 静态域:属于类的级别 1.3.2.静态常量 1.3.3 静态方法 1. ...
- if else; while; break;continue ----流程控制系列
第一种语法: if 条件: # @引号是为了把条件和结果分开. 结果1 # 一个Tab或者4个空格 @告诉程序满足上面的if条件才会执行结果1结果2 #如果条件为真(True),执行结果1,然后执行结 ...
- [福大软工] Z班 第5次成绩排行榜
作业链接 http://www.cnblogs.com/easteast/p/7613070.html 作业要求 团队项目--选题报告 1)发布博客: 一个团队发布一篇随笔,内容为团队的选题报告,选题 ...