主要内容

火车残余网络图像分类

这个例子展示了如何创建一个与残余深度学习神经网络对CIFAR-10数据连接和训练它。剩余连接卷积神经网络架构的流行元素。通过网络使用剩余连接提高梯度流,使深层网络的训练。

对于许多应用程序,使用一个网络,由一个简单的序列层就足够了。然而,一些应用程序需要更复杂的图结构的网络层可以从多个输入层和输出到多个层。这些类型的网络通常被称为有向无环图(DAG)网络。剩余网络是一种DAG网络剩余(或快捷方式)连接,绕过主网络层。剩余连接启用参数梯度更容易传播的早些时候从输出层到层网络,这使得它可以更深层次的网络训练。这增加了网络深度会导致更高的精度更困难的任务。

创建和训练一个网络图结构,遵循这些步骤。

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

  • 添加层到层图使用addLayers,从图中删除层使用removeLayers

  • 层连接到其他层使用connectLayers从其他层使用,断开连接层disconnectLayers

  • 网络体系结构使用情节

  • 列车网络使用trainNetwork。是一个经过训练的网络DAGNetwork对象。

  • 用新的数据进行分类和预测分类预测

这个例子展示了如何构建一个残余网络从头开始。您还可以创建剩余网络使用resnetLayers函数。这个函数允许您快速构造残余网络图像分类任务。

你也可以加载pretrained网络图像分类。有关更多信息,请参见Pretrained深层神经网络

准备数据

下载CIFAR-10数据集[1]。数据集包含60000张图片。每个图像的大小是32-by-32和有三个颜色通道(RGB)。数据集的大小是175 MB。根据您的网络连接,下载过程可能需要时间。

datadir = tempdir;downloadCIFARData (datadir);

加载CIFAR-10训练和测试图像4 - d数组。训练集包含50000张图片和测试集包含10000张图片。使用CIFAR-10测试图像网络验证。

[XTrain, YTrain XValidation YValidation] = loadCIFARData (datadir);

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

图;idx = randperm(大小(XTrain, 4), 20);我= imtile (XTrain (:,:,:, idx),“ThumbnailSize”(96、96));imshow (im)

创建一个augmentedImageDatastore对象用于网络培训。在培训过程中,数据存储随机翻转训练图像沿垂直轴和随机翻译四个像素水平和垂直。数据增加有助于防止网络过度拟合和记忆的训练图像的细节。

图象尺寸= [32 32 3];pixelRange = 4 [4];imageAugmenter = imageDataAugmenter (“RandXReflection”,真的,“RandXTranslation”pixelRange,“RandYTranslation”,pixelRange);augimdsTrain = augmentedImageDatastore(图象尺寸、XTrain YTrain,“DataAugmentation”imageAugmenter,“OutputSizeMode”,“randcrop”);

定义网络体系结构

这些组件的剩余网络体系结构包括:

  • 与卷积的一个主要分支,批处理规范化,按顺序和ReLU层连接。

  • 剩余的连接绕过卷积单位的主要分支。剩余的输出连接和添加element-wise回旋的单位。当激活的大小发生变化时,剩余的连接必须包含1×1卷积层。剩余的连接使参数梯度流更容易从输出层网络层的早些时候,这使得它可以更深层次的网络训练。

创建主要分支

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

  • 一个初始部分包含图像输入层和一个初始的卷积与激活。

  • 三个阶段的卷积层具有不同特征尺寸(32-by-32, 16 x16, 8-by-8)。每个阶段都包含N卷积的单位。在这个示例的一部分,N = 2。每个卷积单元包含两个3×3卷积与激活层。的netWidth参数是网络宽度定义为卷积过滤器的层数的第一阶段网络。第一个回旋的单位在第二和第三阶段downsample空间维度的两倍。保持所需的计算在每一个卷积层大致相同的整个网络,增加过滤器两倍的数量每次执行空间将采样。

  • 最后一节与全球平均池,完全连接,softmax,分类层。

使用convolutionalUnit (numF、跨步、标签)创建一个回旋的单位。numF每一层都是卷积过滤器的数量,是第一个卷积的步幅层单元,然后呢标签是一个字符数组预先考虑到层的名字。的convolutionalUnit函数定义的例子。

给所有的层独特的名字。层从卷积的单位的名称“SjUk”,在那里j指数和阶段吗k卷积的索引单元在这个阶段。例如,“S2U1”表示第二阶段,单位1。

netWidth = 16;层= [imageInputLayer ([32 32 3],“名字”,“输入”)convolution2dLayer (3 netWidth“填充”,“相同”,“名字”,“convInp”)batchNormalizationLayer (“名字”,“BNInp”)reluLayer (“名字”,“reluInp”)convolutionalUnit (netWidth 1“S1U1”)additionLayer (2“名字”,“add11”)reluLayer (“名字”,“relu11”)convolutionalUnit (netWidth 1“S1U2”)additionLayer (2“名字”,“add12”)reluLayer (“名字”,“relu12”)convolutionalUnit (2 * netWidth 2“S2U1”)additionLayer (2“名字”,“add21”)reluLayer (“名字”,“relu21”)convolutionalUnit (2 * netWidth 1“S2U2”)additionLayer (2“名字”,“add22”)reluLayer (“名字”,“relu22”)convolutionalUnit (4 * netWidth 2“S3U1”)additionLayer (2“名字”,“add31”)reluLayer (“名字”,“relu31”)convolutionalUnit (4 * netWidth 1“S3U2”)additionLayer (2“名字”,“add32”)reluLayer (“名字”,“relu32”)averagePooling2dLayer (8,“名字”,“globalPool”)fullyConnectedLayer (10“名字”,“fcFinal”)softmaxLayer (“名字”,“softmax”)classificationLayer (“名字”,“classoutput”));

创建一个层图从数组中。layerGraph连接所有的层按顺序。绘制层图。

lgraph = layerGraph(层);图(“单位”,“归一化”,“位置”(0.2 - 0.2 0.6 - 0.6));情节(lgraph);

创建剩余连接

添加剩余的连接在回旋的单位。大多数剩余连接执行任何操作,只需将element-wise添加到输出卷积的单位。

创造的剩余连接“reluInp”“add11”层。因为你指定的数量输入添加层两个当您创建层,该层有两个输入姓名“三机”“in2”。最后一层的第一个回旋的单位已经连接到“三机”输入。添加层然后总结第一卷积单元和输出“reluInp”层。

以同样的方式连接“relu11”层的第二个输入“add12”层。检查你有正确连接层通过绘制层图。

lgraph = connectLayers (lgraph,“reluInp”,“add11 / in2”);lgraph = connectLayers (lgraph,“relu11”,“add12 / in2”);图(“单位”,“归一化”,“位置”(0.2 - 0.2 0.6 - 0.6));情节(lgraph);

当层激活卷积单位改变大小(也就是说,当它们downsampled空间和upsampled通道尺寸),剩余的激活连接也必须改变大小。更改激活大小的残余连接使用1×1卷积层及其批量标准化层。

skip1 = [convolution2dLayer (1、2 * netWidth,“步”2,“名字”,“skipConv1”)batchNormalizationLayer (“名字”,“skipBN1”));lgraph = addLayers (lgraph skip1);lgraph = connectLayers (lgraph,“relu12”,“skipConv1”);lgraph = connectLayers (lgraph,“skipBN1”,“add21 / in2”);

添加网络的身份连接在第二阶段。

lgraph = connectLayers (lgraph,“relu21”,“add22 / in2”);

改变激活大小之间的残余连接第二和第三阶段由另一个1×1卷积层及其批量标准化层。

skip2 = [convolution2dLayer (1, 4 * netWidth,“步”2,“名字”,“skipConv2”)batchNormalizationLayer (“名字”,“skipBN2”));lgraph = addLayers (lgraph skip2);lgraph = connectLayers (lgraph,“relu22”,“skipConv2”);lgraph = connectLayers (lgraph,“skipBN2”,“add31 / in2”);

添加最后一个身份连接和情节最后一层图。

lgraph = connectLayers (lgraph,“relu31”,“add32 / in2”);图(“单位”,“归一化”,“位置”(0.2 - 0.2 0.6 - 0.6));情节(lgraph)

创建更深层次的网络

创建一个层图与残余CIFAR-10任意深度和宽度的数据连接,使用支持功能金宝appresidualCIFARlgraph

lgraph = residualCIFARlgraph (netWidth numUnits unitType)创建一个与残余CIFAR-10数据连接层图。

  • netWidth是网络宽度,定义为3×3的卷积过滤器的数量在第一层的网络。

  • numUnits是卷积的数量单位的主要分支网络。因为网络包括三个阶段,每个阶段都有相同数量的回旋的单位,numUnits必须是一个整数3的倍数。

  • unitType是卷积单元的类型,指定为“标准”“瓶颈”。一个标准的3×3的卷积卷积单元包括两个层次。瓶颈卷积单元包括三个卷积层:将采样1×1层的通道尺寸,3 x3的卷积层和一层1×1的upsampling频道维度。因此,瓶颈卷积卷积层单元有50%超过一个标准单位,但只有一半的数量3×3的旋转空间。两种单元类型有相似的计算复杂度,但总数中传播特性剩余连接是四倍使用瓶颈时单位。总深度,定义为序列卷积和完全连接层的最大数量,是2 *numUnits为网络与标准单位和3 + 2 *numUnits+ 2单位的网络瓶颈。

创建一个残余网络与九个标准卷积单位(每阶段三个单位)和宽度16。总网络深度2 * 9 + 2 = 20。

numUnits = 9;netWidth = 16;lgraph = residualCIFARlgraph (netWidth numUnits,“标准”);图(“单位”,“归一化”,“位置”(0.1 - 0.1 0.8 - 0.8));情节(lgraph)

列车网络的

指定培训选项。火车80年的网络时代。选择一个学习速率正比于mini-batch大小和学习速率降低10倍后60时代。验证每个时代网络一次使用验证数据。

miniBatchSize = 128;learnRate = 0.1 * miniBatchSize / 128;valFrequency =地板(大小(XTrain 4) / miniBatchSize);选择= trainingOptions (“个”,“InitialLearnRate”learnRate,“MaxEpochs”,80,“MiniBatchSize”miniBatchSize,“VerboseFrequency”valFrequency,“洗牌”,“every-epoch”,“阴谋”,“训练进步”,“详细”假的,“ValidationData”{XValidation, YValidation},“ValidationFrequency”valFrequency,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”、60);

培训网络使用trainNetwork,设置doTraining旗帜真正的。否则,加载一个pretrained网络。培训网络良好的GPU大约需要两个小时。如果你没有一个GPU,然后培训需要更长的时间。

doTraining = false;如果doTraining trainedNet = trainNetwork (augimdsTrain、lgraph选项);其他的负载(“cifarnet - 20 - 16. -垫”,“trainedNet”);结束

评估培训网络

计算的最终精度网络训练集(没有数据增大)和验证集。

(YValPred,聚合氯化铝)= (trainedNet XValidation)进行分类;validationError =意味着(YValPred ~ = YValidation);YTrainPred =分类(trainedNet XTrain);trainError =意味着(YTrainPred ~ = YTrain);disp (“训练误差:+ trainError * 100 +“%”)
训练误差:2.862%
disp ("验证错误:"+ validationError * 100 +“%”)
验证错误:9.76%

情节混乱矩阵。显示每个类的精度和召回通过使用列和行摘要。网络最常把猫和狗。

图(“单位”,“归一化”,“位置”(0.2 - 0.2 0.4 - 0.4));厘米= confusionchart (YValidation YValPred);厘米。Title =验证数据的混淆矩阵的;厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;

你可以显示一个随机样本的九个测试图片连同他们的预测类和类的概率使用以下代码。

图idx = randperm(大小(XValidation, 4), 9);i = 1:元素个数(idx)次要情节(3 3 i) imshow (XValidation (:,:,:, idx(我)));概率= num2str (100 * max(聚合氯化铝(idx(我),:)),3);predClass = char (YValPred (idx (i)));标题([predClass,”、“概率,“%”])结束

convolutionalUnit (numF、跨步、标签)创建一个数组的层两层卷积和相应的批规范化和ReLU层。numF是卷积过滤器,的数量是第一个卷积的步幅层,然后呢标签是一个标签,是所有图层名称前缀。

函数层= convolutionalUnit (numF、跨步、标签)层= [convolution2dLayer (3 numF“填充”,“相同”,“步”步,“名字”,标签,“conv1”])batchNormalizationLayer (“名字”,标签,“BN1”])reluLayer (“名字”,标签,“relu1”numF]) convolution2dLayer(3日,“填充”,“相同”,“名字”,标签,“conv2”])batchNormalizationLayer (“名字”,标签,“BN2”)));结束

引用

[1]Krizhevsky,亚历克斯。“学习的多层功能从微小的图像。”(2009). https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

[2]他开明、象屿张任Shaoqing,剑太阳。“深层残留图像识别的学习。”在《IEEE计算机视觉与模式识别会议,770 - 778页。2016年。

另请参阅

|||||

相关的话题