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 所述通过编译。)
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(1:2)) ; 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(1) ; 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]的一部分拿来训练。