第1章 MatConvNet简介

正文

MatConvNet是一个实现用于计算机视觉应用的卷积神经网络(CNN)的MATLAB工具箱。自从[8]的突破性工作以来,CNN在计算机视觉和特别是图像理解方面产生了重大影响,从本质上取代了传统的图像表示,例如我们自己的VLFeat [13]开源库中实现的图像表示。虽然大多数CNN是通过构造简单的线性和非线性滤波操作(如卷积和整形)来获得的,但它们的实现并不是微不足道的。原因是CNN需要从大量数据中学习,通常需要数百万的图像,这需要非常有效的实现。作为大多数CNN库,MatConvNet通过使用各种优化和支持,通过支持GPU上的计算来实现这一点。还有许多其他机器学习,深度学习和CNN开源库。引用一些最流行的:CudaConvNet1,Torch2 ,Theano3和Caffe4。许多这些图书馆得到了很好的支持,有数十个积极的贡献者和庞大的用户群。因此,为什么要创建另一个库?开发MatConvNet的关键动机是为研究人员提供一个特别友好和有效的环境5,以供研究人员在他们的研究中使用。MatConvNet通过深入集成在MATLAB环境中实现了这一点,该环境是计算机视觉研究中最流行的开发环境之一,和其他许多领域一样。特别是,MatConvNet公开了简单的MATLAB命令CNN构建块,如卷积,规范化和池化(第4章);这些可以随后进行组合和扩展,轻松创建CNN结构。尽管许多这样的模块使用了用C ++和CUDA编写的优化的CPU和GPU实现(1.4节),但对GPU计算的MATLAB原生支持意味着通常可以在MATLAB中直接编写新模块,同时保持计算效率。与使用低级语言编写新的CNN组件相比,这是一个重要的简化,可以显着加速测试新想法。使用MATLAB还提供了一个通往其他领域的桥梁;例如,MatConvNet最近被亚利桑那大学用于行星科学,正如本NVIDIA博客文章所总结的那样。6
MatConvNet可以从数百万的图像中学习大型CNN模型,如AlexNet [8]和[11]的非常深的网络。这些功能强大的模型的预训练版本可以从MatConvNet主页7下载。虽然功能强大,但MatConvNet仍然易于使用和安装。这个实现是完全独立的,只需要MATLAB和一个兼容的C ++编译器(使用GPU代码需要免费提供的CUDA DevKit和一个合适的NVIDIA GPU)。如图所示。 1.1和1.1节,可以使用三个MATLAB命令下载,编译和安装MatConvNet。包括几个功能完整的示例,演示如何学习小型和大型网络。重要的是,几个标准的预先训练好的网络可以立即下载并用于应用程序。一本包含工具箱完整技术说明的手册与工具箱一起维护。这些特性使得MatConvNet在教育环境中也很有用。9
MatConvNet是一种类似BSD的许可证发布的开源软件。它可以从http://www.vlfeat.org/matconvnet和GitHub.10下载。

1https://code.google.com/p/cuda-convnet/    
2http://cilvr.nyu.edu/doku.php?id=code:start    3http://deeplearning.net/software/theano/     
4http://caffe.berkeleyvision.org     
5从用户的角度来看,MatConvNet目前依赖于Matlab,该库是在MATLAB代码与C++和CUDA核之间的干净分离中开发的,因此,在将来,该库可以扩展以独立于Matlab处理卷积网络。

1.1 入门

MatConvNet易于安装和使用。图1.1提供了一个使用最新一代深度卷积神经网络对图像进行分类的完整示例。这个例子包括下载MatConvNet,编译软件包,下载预先训练的CNN模型,以及在MATLAB的一张股票图像上评估后者。本例中的关键命令是vl_simplenn,它是一个包装器,它将CNN网络和预处理图像im_作为输入,并生成结果的结构res作为输出。这个特定的包装器可以用来构建具有简单结构的网络,即一系列操作。检查vl_simplenn的代码(在MatConvNet中编辑vl_simplenn)我们注意到wrapper依次转换数据,应用网络配置指定的许多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为诸如AlexNet [8]或Network-in-Network [9]等标准CNN结构提供了诸如vl_simplenn之类的包装器。此外,该库提供了大量示例(在examples/子目录中),包括学习MNIST,CIFAR和ImageNet数据集上各种模型的代码。所有这些例子都使用examples / cnn_train训练代码,这是一个随机梯度下降(3.3节)的实现。 虽然这个训练代码可以完美的使用并且十分灵活,但由于存在一些特定问题,它仍然保留在examples/子目录中。欢迎用户实现自己的优化器。

% 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 preetrained 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 preetrained CNN 
net = load('imagenet-vgg-f.mat') ; 

% load and preprocess an image 
im = imread('peppers.png') ; 
im_ = imresize(single(im), net.meta.normalization.imageSize(1:2)) ; 
im_ = im_ - net.meta.normalization.averageImage;

% run the CNN                                    
res = vl_simplenn(net, im_) ;

% show the classifification result scores = squeeze(gather(res(end).x)) ; 
[bestScore, best] = max(scores) ; 
fifigure(1) ; clf ; imagesc(im) ; 
title(sprintf('%s (%d), score %.3f',... net.classes.description{best}, best, bestScore)) ; 
bell pepper (946), score 0.704
图1.1: 一个完整的例子,包括下载、安装、编译和运行MatConvNet,并使用一个经过ImageNet预训练的大型CNN模型对MATLAB中存储的一张图像进行分类。

1.2 MatConvNet一览

MatConvNet有一个简单的设计理念。它并没有将CNN包裹在复杂的软件层面上,而是直接将MATLAB命令直接展现为计算CNN构建模块的简单函数,如线性卷积和ReLU运算符。这些构建块很容易组合成完整的CNN,并可用于实现复杂的学习算法。尽管提供了几个真实的小型和大型CNN结构和训练例程,但仍可以利用MATLAB原型设计的高效性回到底层构建自己的结构。通常不需要C编码来实现新的结构。因此,MatConvNet是计算机视觉和CNN研究的理想场所。
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,CIFAR10和ImageNet数据上使用随机梯度下降和CPU或GPU学习CNN的例子。
  • 预先训练的模型。MatConvNet提供了几种最先进的预先训练好的CNN模型,可以用于现成的图像分类,或者以Caffe或DeCAF的精神生成图像编码。
Figure 1.2: Training AlexNet on ImageNet ILSVRC: dropout vs batch normalisation

1.3 文档和示例

MatConvNet有三个主要的信息来源。首先,网站包含所有功能和几个示例和教程的说明。11其次,有一个PDF手册,其中包含有关工具箱的大量技术细节,包括详细的构建块的数学描述。第三,MatConvNet带有几个例子(1.1节)。
大多数例子都是完全独立的。例如,为了运行MNIST示例,它需要将MATLAB指向MatConvNet根目录并输入addpath←examples,然后输入cnn_mnist。由于问题的大小,ImageNet ILSVRC示例需要做更多准备,包括下载和预处理映像(使用捆绑的脚本utils / preprocess-imagenet.sh)。还包括几个高级示例,例如图1.2说明了与AlexNet [8]类似的模型使用标准的dropout正则化或最新的batch normlisation(批量归一化)技术[4]来训练得到的top-1和top-5的验证错误。结果显示后者收敛时间为前者的大约三分之一(通过训练数据)。MatConvNet网站还包含许多预训练模型,即在ImageNet ILSVRC上进行过训练的大型CNN,可以下载并作为其他许多问题的起点[1]。这些包括:AlexNet [8],VGG-S,VGG-M,VGG-S [1]和VGG-VD16以及VGG-VD-19 [12]。图1.1示例代码展示了如何在几行MATLAB代码中使用一个这样的模型。

表1.1 ImageNet 训练速度(帧/秒)
modelbatch szCPUGPUCuDNN
AlexNet25622.1192.4264.1
VGG-F25621.4211.4289.7
VGG-M1287.8116.5136.6
VGG-S1287.496.2110.1
VGG-VD-16241.718.420.0
VGG-VD-19241.515.716.5

1.4 速度

效率对于使用CNN非常重要。MatConvNet支持使用NVIDIA GPU,因为它包含了所有算法的CUDA实现(或依赖于MATLAB CUDA支持)。
如果使用GPU(假设有合适的硬件可用,并且工具箱已经用GPU支持编译),可以简单地将参数转换为MATLAB中的gpuArrays,如y = vl_nnconv(gpuArray(x),gpuArray(w),[]) )。以这种方式,CPU和GPU之间的切换是完全透明的。请注意,MatConvNet还可以使用NVIDIA CuDNN库,并具有显着的速度和空间收益。
接下来,我们将评估MatConvNet在ImageNet ILSVRC 2012挑战数据上训练大型结构时的性能[2]。测试机是戴尔服务器,具有两个频率为3.30 GHz的Intel Xeon CPU E5-2667 v2(每个CPU具有八个内核),256 GB内存以及四个NVIDIA Titan Black GPU(只有其中一个使用,除非另有说明)。实验使用MatConvNet beta12,CuDNN v2和MATLAB R2015a。对数据进行预处理以避免在MATLAB中重新缩放图像,并将其存储在RAM磁盘中以便更快速地访问。该代码使用vl_imreadjpeg命令通过多个独立线程从磁盘读取大批量的JPEG图像。驱动程序examples / cnn_imagenet.m用于所有实验。
我们对第1.3节中讨论的模型在ImageNet ILSVRC数据集上进行了训练。表1.1报告了训练速度即随机梯度下降法每秒处理的图像数量。 AlexNet使用CuDNN以大约264图像/秒的速度进行训练,比使用CuBLAS的速度快约40%,比使用CPU快10倍以上。此外,我们注意到,尽管MATLAB开销很大,但实现速度与Caffe相当(他们报告使用CuDNN和Titan报告253图像/ s,这比此处使用的Titan Black稍慢)。还要注意的是,随着模型规模的不断增大,SGD批量的大小必须减小(以适应GPU内存),从而增加开销的影响。
表1.2报告了使用多个GPU的VGG-VD-16(一种非常大的模型)的速度。在这种情况下,批量大小设置为264个图像,并进一步划分为22个图像的子批次以适应GPU内存;后者则分布在同一台机器上的1到4个GPU中。虽然存在大量的通信开销,但训练速度从20帧/秒增加到45帧/秒。解决这一问题是本库的中期目标之一。

表1.2 多GPU速度(帧/秒)
num GPUs1234
VGG-VD-1620.0022.2038.1844.8

1.5 致谢

MatConvNet是一个社区项目,所有贡献者都会这样认可。我们非常感谢NVIDIA支持这个项目,为我们提供顶级的GPU和MathWorks,以便继续讨论如何改进该库。这个库中的几个CNN计算的实现受到了Caffe库[6]的启发(然而,Caffe不是依赖项)。 一些示例网络已经由Karen Simonyan作为[1]和[12]的一部分进行了训练。

翻译不当之处,敬请指出,及时修改,以利他人,万分感谢!

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值