主要内容

火车剩余网络进行图像分类

此示例显示了如何创建具有剩余连接的深度学习神经网络,并在CIFAR-10数据上培训。残差连接是卷积神经网络架构中的流行元素。使用残差连接通过网络提高梯度流程,并启用更深的网络训练。

对于许多应用程序,使用由简单的层序列组成的网络就足够了。然而,一些应用需要具有更复杂图形结构的网络,其中各层可以具有来自多个层的输入,并输出到多个层。这些类型的网络通常称为有向无环图(DAG)网络。剩余网络是一种DAG网络,具有绕过主网络层的剩余(或快捷)连接。剩余连接使参数梯度更容易从输出层传播到网络的早期层,这使得训练更深层次的网络成为可能。这种增加的网络深度可以在更困难的任务上获得更高的精确度。

要创建和训练具有图形结构的网络,请执行以下步骤。

  • 创建一个分层图对象使用分层图.层图指定了网络的结构。您可以创建一个空的层图,然后向它添加层。您还可以直接从网络层数组创建层图。在这种情况下,分层图一个接一个地连接数组中的图层。

  • 添加图层到图层图使用addlayers.,并使用从图形中删除图层搬运工

  • 使用将图层连接到其他图层ConnectLayers.,并使用断开图层与其他图层的连接断开层

  • 绘制网络架构使用情节

  • 使用列车网络.经过培训的网络是Dagnetwork.目的。

  • 使用新数据执行分类和预测分类预测

此示例演示如何从头开始构建剩余网络。还可以使用创建剩余网络ResetLayers.功能。此功能允许您快速构建用于图像分类任务的剩余网络。

您还可以加载预训练网络进行图像分类。有关更多信息,请参阅普里德深度神经网络

准备数据

下载CIFAR-10数据集[1]。该数据集包含60000个图像。每个图像的大小为32×32,并有三个颜色通道(RGB)。数据集的大小为175 MB。下载过程可能需要时间,具体取决于您的internet连接。

datadir = tempdir;downloadcardata(datadir);

将CIFAR-10训练和测试图像作为4-D阵列加载。训练集包含50000个图像,测试集包含10000个图像。使用CIFAR-10测试映像进行网络验证。

[XTrain、YTrain、XValidation、YValidation]=loadCIFARData(数据目录);

您可以使用以下代码显示训练图像的随机样本。

数字;IDX = RANDPERM(大小(XTRAIN,4),20);IM = IMTILE(XTrain(::::,idx),“拇指指甲大小”,[96,96]);imshow(im)

创建一个增强图像数据存储用于网络培训的对象。在训练期间,数据存储架随机将训练图像随机翻转垂直轴,随机将最多四个像素水平和垂直转换。数据增强有助于防止网络过度接收和记忆培训图像的确切细节。

图像_ [32 32 3];PIXELRANGE = [-4 4];imageaugmenter = imagedataAugmenter(......“RandXReflection”,真的,......“随机翻译”,pixelrange,......'randytranslation',pixelRange);augimdsTrain=增强的图像数据存储(图像大小,XTrain,YTrain,......“数据增强”,影像增强器,......“OutputSizeMode”,“randcrop”);

定义网络架构

剩余网络体系结构由以下组件组成:

  • 一个具有卷积、批处理规范化和ReLU层顺序连接的主分支。

  • 剩余连接绕过主分支的卷积单元。剩余连接和卷积单元的输出按元素添加。当激活的大小改变时,剩余连接还必须包含1×1卷积层。剩余连接使参数梯度更容易从输出层流向网络的早期层,这使得训练更深层次的网络成为可能。

创建主分支

首先创建网络的主分支。主分支包含五个部分。

  • 包含图像输入层的初始部分和具有激活的初始卷积。

  • 具有不同特征尺寸(32×32、16×16和8×8)的卷积层的三个阶段。每个阶段包含N卷积单位。在该示例的这一部分,n = 2。每个卷积单元包含两个具有激活的3×3卷积层NetWidth.参数为网络宽度,定义为网络第一阶段卷积层中滤波器的个数。在第二和第三阶段的第一个卷积单元对空间维度进行因子二的采样。为了在整个网络中保持每个卷积层所需的计算量大致相同,每次执行空间向下采样时将过滤器的数量增加两倍。

  • 具有全局平均池、完全连接、softmax和分类层的最后一部分。

卷积单位(numF、步幅、标记)创建卷积单元。numf.为每层卷积滤波器的个数,大步走是单元的第一个卷积层的步长,并且标签是一个字符数组,用于在层名称前加前缀卷积单位函数在示例末尾定义。

为所有层指定唯一的名称。卷积单元中的层的名称以开头'sjuk'哪里J是舞台指数和K是该阶段内卷积单元的索引。例如's2u1'表示第2阶段,第1单元。

NetWidth = 16;图层= [imageInputLayer([32 32 3],“姓名”,“输入”)卷积2dlayer(3,NetWidth,“填充”,'相同的',“姓名”,“康文普”)批处理规范化层(“姓名”,“BNInp”)雷卢耶(“姓名”,'reluinp')卷积单元(netWidth,1,'s1u1')附加层(2,“姓名”,“地址11”)雷卢耶(“姓名”,“relu11”)卷积单元(netWidth,1,'s1u2')附加层(2,“姓名”,'Add 12')雷卢耶(“姓名”,“relu12”)卷积帆船(2 * NetWidth,2,'s2u1')附加层(2,“姓名”,'Add21')雷卢耶(“姓名”,“relu21”)卷大钢筋(2 * NetWidth,1,'s2u2')附加层(2,“姓名”,“地址22”)雷卢耶(“姓名”,“relu22”)卷积单元(4*netWidth,2,‘S3U1’)附加层(2,“姓名”,'Add31')雷卢耶(“姓名”,“relu31”)卷积单元(4*netWidth,1,‘S3U2’)附加层(2,“姓名”,'Add32')雷卢耶(“姓名”,“relu32”)平均池2层(8,“姓名”,'globalpool')全连接层(10,“姓名”,“fcFinal”)软MaxLayer(“姓名”,'softmax'scassificationlayer(“姓名”,'ClassOutput') ];

从图层阵列创建图层图。分层图连接中的所有层顺序地。绘制图层图。

lgraph=图层图形(图层);图形(“单位”,“正常化”,“位置”,[0.2 0.2 0.6 0.6]); 绘图(lgraph);

创建剩余连接

在卷积单元周围添加剩余连接。大多数剩余连接不执行任何操作,只需向卷积单元的输出添加元素。

从中创建剩余连接'reluinp'到了“地址11”层由于在创建图层时已将添加图层的输入数指定为两个,因此该图层有两个具有名称的输入'在1'“in2”.第一卷积单元的最终层已经连接到'在1'然后加法层将第一个卷积单元和第二个卷积单元的输出相加'reluinp'

以相同的方式,连接“relu11”层到第二个输入'Add 12'层通过绘制图层图来检查是否已正确连接图层。

lgraph=连接层(lgraph,'reluinp',“add11/in2”); lgraph=连接层(lgraph,“relu11”,'Add12 / In2');数字(“单位”,“正常化”,“位置”,[0.2 0.2 0.6 0.6]); 绘图(lgraph);

当卷积单元中的层激活改变大小时(即,当它们在空间上下采样,在通道维度上上上采样),剩余连接中的激活也必须更改大小。通过使用1×1卷积层及其批处理规范化层来更改剩余连接中的激活大小。

skip1=[convolution2dLayer(1,2*netWidth,“大步走”2.“姓名”,“skipConv1”)批处理规范化层(“姓名”,“skipBN1”)]; lgraph=addLayers(lgraph,skip1);lgraph=连接层(lgraph,“relu12”,“skipConv1”); lgraph=连接层(lgraph,“skipBN1”,“add21/in2”);

在网络的第二阶段添加标识连接。

lgraph=连接层(lgraph,“relu21”,'Add22 / In2');

将另一个1×1卷积层与其批量归一化层一起改变第二和第三阶段之间的残余连接的激活尺寸。

skip2=[convolution2dLayer(1,4*netWidth,“大步走”2.“姓名”,“skipConv2”)批处理规范化层(“姓名”,“skipBN2”)]; lgraph=addLayers(lgraph,skip2);lgraph=连接层(lgraph,“relu22”,“skipConv2”); lgraph=连接层(lgraph,“skipBN2”,“add31/in2”);

添加最后一个身份连接并绘制最终的图层图。

lgraph=连接层(lgraph,“relu31”,“add32/in2”);数字(“单位”,“正常化”,“位置”,[0.2 0.2 0.6 0.6]); 绘图(lgraph)

创建更深的网络

要为任意深度和宽度的CIFAR-10数据创建具有剩余连接的图层图,请使用支持函数金宝appResealutCifarlgraph..

Lgraph = ResealualCifarlgraph(NetWidth,NumUnits,Unittype)为CIFAR-10数据创建具有剩余连接的数据图形图。

  • NetWidth.是网络宽度,定义为网络前3×3卷积层中的滤波器数量。

  • numunits.是网络主分支中卷积单元的数量。因为网络由三个阶段组成,每个阶段具有相同数量的卷积单元,numunits.必须是3的整数倍。

  • 单位类型是卷积单元的类型,指定为“标准”或者“瓶颈”.一个标准的卷积单元由两个3 × 3的卷积层组成。瓶颈卷积单元由三个卷积层组成:1 × 1层用于信道维的下采样,3 × 3卷积层和1 × 1层用于信道维的上采样。因此,瓶颈卷积单元比标准单元多50%的卷积层,但只有一半的空间3 × 3卷积。这两种类型的单元具有相似的计算复杂度,但是当使用瓶颈单元时,在剩余连接中传播的特征总数是原来的4倍。总深度,定义为序列卷积和完全连接层的最大数量,为2*numunits.+2个用于带有标准单元的网络,3个用于*numunits.+ 2用于带瓶颈单元的网络。

创建具有九个标准卷积单元(每级三个单元)和16个宽度的剩余网络。网络总深度为2*9+2=20。

numnits=9;netWidth=16;lgraph=residualCIFARlgraph(netWidth,numnits,“标准”);数字(“单位”,“正常化”,“位置”,[0.1 0.1 0.8 0.8]);情节(lgraph)

列车网络

指定培训选项。对网络进行80个历元的培训。选择与小批量大小成比例的学习率,并在60个历元后将学习率降低10倍。使用验证数据对每个历元的网络进行一次验证。

miniBatchSize=128;learnRate=0.1*miniBatchSize/128;valFrequency=floor(尺寸(XTrain,4)/miniBatchSize);选项=培训选项(“sgdm”,......“初始学习率”,learnRate,......'maxepochs',80,......“MiniBatchSize”,小批量,......“详细频率”,valFrequency,......“洗牌”,'每个时代',......“情节”,'培训 - 进步',......“冗长”,错误的,......'vightationdata',{XValidation,YValidation},......'验证职业',valFrequency,......“LearnRateSchedule”,'分段',......“LearnRateDropFactor”,0.1,......'学习ropperiod',60);

使用列车网络,设置溺爱旗帜到真的.否则,加载预训练的网络。在一个良好的GPU上训练网络需要大约两个小时。如果你没有GPU,那么训练需要更长的时间。

dotraining = false;如果doTraining trainedNet=列车网络(AugimdTrain、lgraph、选项);其他的加载('cifarnet-20-16.mat','trousahynet');终止

评估培训网络

计算网络在训练集(无数据增强)和验证集上的最终精度。

[yvalpred,probs] =分类(trousaignnet,xvalidation);validationError =均值(yvalpred〜= yvalidation);YTrainPred =分类(TRAIRATIONNET,XTRAIN);TrainError =平均值(Ytrainpred〜= Ytrain);DISP(“训练错误:”+列车错误*100+"%")
训练错误:2.862%
DISP(“验证错误:”+ validationError * 100 +"%")
验证错误:9.76%

绘制混乱矩阵。使用列和行摘要显示每个类的精度并回忆。网络最常见地让猫与狗混淆。

身材(“单位”,“正常化”,“位置”,[0.2 0.2 0.4 0.4]); cm=混淆图(YValidation,YValPred);cm.标题=“验证数据的混淆矩阵”;厘米。ColumnSummary =“列规格化”;cm.概述=“行规范化”

您可以使用以下代码显示九个测试图像的随机样本及其预测的类和这些类的概率。

图idx = randperm(大小(xvalidation,4),9);对于i=1:numel(idx)子图(3,3,i)imshow(XValidation(:,:,:,idx(i));prob=num2str(100*max(probs(idx(i),:)),3);predClass=char(YValPred(idx(i));title([predClass,', ',prob,'%'])终止

卷积单位(numF、步幅、标记)创建具有两个卷积层的层数组和相应的批量归一化和Relu层。numf.是卷积滤波器的数量,大步走是第一个卷积层的步长,并且标签是在所有图层名称前面加上的标记。

功能层=卷积单位(numF,步幅,标记)层=[卷积2层(3,numF,“填充”,'相同的',“大步走”大步走“姓名”,[标签,'conv1'])BatchnormalizationLayer(“姓名”,[标签,'bn1'])雷卢耶(“姓名”,[标签,“relu1”])卷积2dlayer(3,numF,“填充”,'相同的',“姓名”,[标签,“conv2”])BatchnormalizationLayer(“姓名”,[标签,'bn2'])];终止

参考文献

[1] Alex Krizhevsky,“从微小图像中学习多层特征”(2009)。https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

[2] 何开明、张向宇、任少清和孙健,《图像识别的深度剩余学习》,年计算机愿景和模式识别的IEEE会议的诉讼程序,pp.770-778。2016年。

另见

|||||

相关话题