MatConvnet工具箱文档翻译理解(4)

第3章 包装器和预训练模型

这是很容易的组合第4章“手动”的计算块,但通常通过一个包装器来使用它们可以实现CNN架构给定一个模型规范通常更方便,可用的包装器总结在3.1节。 
MatConvNet还附带了许多用于图像分类的预训练模型(其中大多数 
在ImageNet ILSVRC挑战上训练),图像分割,文本点样和面部识别。 这些使用非常简单,如3.2节所示。

3.1包装

MatConvNet提供了两个包装器:用于基本链块链(3.1.1节)的SimpleNN和用于更复杂的直接非循环图(参见3.1.2节)的块的DagNN。

3.1.1 SimpleNN

SimpleNN包装器适用于由计算块的线性链组成的网络。 它主要由vl_simplenn函数(对CNN及其派生的评估)以及一些其他支持函数(例如vl_simplenn_move(移动CPU和GPU之间的CNN)和vl_simplenn_display(获得和/或打印关于CNN的信息)实现)。

vl_simplenn接收表示CNN的结构网络作为输入,以及输入x和潜在输出导数dzdy,这取决于操作模式。 有关输入和输出格式的详细信息,请参阅vl_simplenn函数的内联帮助。 实际上,vl_simplenn的实现是如何可以一起使用基本神经网络构建块的良好示例,并且可以作为更复杂实现的基础。

3.1.2 DagNN

DagNN包装器比SimpleNN更复杂,因为它必须支持任意图形拓扑。 它的设计是面向对象的,有一个类实现每个层类型。 虽然这增加了复杂性,并且使得微小的CNN架构(例如MNIST)的包装器稍微更慢,但是实际上它更加灵活和更容易扩展。 
DagNN由dagnn.DagNN类(在dagnn命名空间下)实现。

3.2 Pre-trained models

vl_simplenn易于使用预训练模型(见主页下载一些)。 
例如,以下代码下载在ImageNet数据上预先训练的模型,并将其应用于MATLAB库存图像之一:

% setup MatConvNet in MATLAB
run matlab/vl_setupnn
% download a pretrained CNN from the web
urlwrite(...
'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...
'imagenet-vgg-f.mat');
net = load('imagenet-vgg-f.mat') ;
% obtain and preprocess an image
im = imread('peppers.png') ;
im_ = single(im) ; % note: 255 range
im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
im_ = im_-net.meta.normalization.averageImage ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

请注意,在运行网络之前应对图像进行预处理。 虽然预处理规范取决于模型,但预训练模型包含描述预期预处理类型的网络规范化场。 特别要注意的是,该网络将固定大小的图像作为输入,并且需要去除平均值; 此外,图像强度在[0,255]的范围内归一化。 
下一步是运行CNN。 这将返回一个res结构的输出网络层:

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

最后一层的输出可用于分类图像。 为了方便起见,类名称包含在网络结构中:

% show the classification result
scores = squeeze(gather(res(end).x)) ;
[bestScore, best] = max(scores) ;
figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',···net.meta.classes.description{best}, best, bestScore)) ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意,几个扩展是可能的。 首先,图像可以裁剪而不是重新定标。 第二,多种裁剪可以喂给网络和结果平均,通常为改进的结果。 第三,网络的输出可以用作图像编码的通用特征。

3.3学习模型

由于MatConvNet可以使用反向传播计算CNN的导数,因此使用它实现学习算法很简单。 因此,随机梯度下降的基本实现是简单的。 
示例代码在examples / cnn_train中提供。这个代码是足够的,以允许在NMINST,CIFAR,ImageNet和其他许多数据集上训练。相应的示例在examples /目录中提供。

3.4运行大规模实验

对于大规模实验,例如为ImageNet学习网络,强烈建议使用NVIDIA GPU(至少6GB内存)和足够的CPU和磁盘速度。 例如,要在ImageNet上训练,我们建议如下: 
1.下载ImageNet数据http://www.imagenet.org/challenges/LSVRC。 安装它在某个地方,并从数据/ imagenet12链接到它 
2.考虑预处理数据以将所有图像转换为高度为256像素。这可以通过提供的utils / preprocess-imagenet.sh脚本来完成。 在这里方式,训练不必每次都调整图像的大小。 不要忘记指向将训练代码转换为预处理数据。 
3.考虑将数据集复制到RAM磁盘(前提是您有足够的内存),以便更快地访问。 不要忘记将训练代码指向此副本。 
4.编译MatConvNet与GPU支持。 有关说明,请参阅主页。 
一旦你的设置准备好了,你应该能够运行examples /cnn_imagenet(编辑并根据需要更改任何标志以启用GPU支持和多个映像预取线程)。如果一切顺利,你应该期望能够训练与200-300图像/秒。

猜你喜欢

转载自blog.csdn.net/shenziheng1/article/details/80473374
今日推荐