主要内容

用嵌套层列车深入学习网络

此示例显示如何使用嵌套图层训练网络。

要创建自定义图层,本身定义了图层图,可以指定一个dlnetwork.对象作为可学习参数。这种方法被称为网络组成.您可以使用网络构图:

  • 创建单个自定义层,其表示可被动层块,例如剩余块。

  • 使用控制流创建网络。例如,具有可以根据输入数据动态地改变的部分的网络。

  • 创建一个有循环的网络。例如,具有将输出反馈回自身的部分的网络。

有关更多信息,请参阅深度学习网络组成

这个例子展示了如何使用代表剩余块的定制层来训练网络,每个层包含多个卷积、分组归一化和带有跳过连接的ReLU层。以获取如何创建残留网络的示例没有使用自定义层,参见火车剩余网络进行图像分类

残差连接是卷积神经网络结构中的一个流行元素。残留网络是指绕过主网络层的残留(或捷径)连接的网络。使用剩余连接改善了网络的梯度流,并使训练更深层次的网络成为可能。这种增加的网络深度可以在更困难的任务中产生更高的准确性。

此示例使用自定义图层ResidualblockLayer.,它包含一个可学习的层块,由卷积层、组归一化层、ReLU层和加法层组成,还包括一个跳过连接以及在跳过连接中可选的卷积层和组归一化层。此图突出显示了残余块结构。

有关如何创建自定义图层的示例ResidualblockLayer.,请参阅定义嵌套深度学习层

准备数据

下载并提取花朵数据集[1]。

URL =.'http://download.tensorflow.org/example_images/flower_photos.tgz';downloadfolder = tempdir;filename = fullfile(downloadFolder,'flower_dataset.tgz');imagefolder = fullfile(downloadFolder,'flower_photos');如果~存在(imageFolder'dir')disp('下载鲜花数据集(218 MB)......')Websave(Filename,URL);Untar(文件名,DownloadFolder)结尾

创建包含照片的图像数据存储。

datasetFolder = fullfile (imageFolder);imd = imageDatastore (datasetFolder,...'insertumbfolders',真的,...'labelsource'“foldernames”);

将数据划分为训练和验证数据集。使用70%的图像进行训练,30%的图像进行验证。

[IMDStrain,IMDSValidation] = SpliteachLabel(IMDS,0.7,'随机');

查看数据集的类数。

Classes =类别(IMDS.Labels);numclasses = numel(类)
numClasses = 5

数据增强有助于防止网络过度接收和记忆培训图像的确切细节。调整大小并增强图像以使用imageDataAugmenter目的:

  • 随机反映垂直轴中的图像。

  • 随机翻译图像高达30像素垂直和水平。

  • 将图像随机旋转至45度,逆时针方向。

  • 随机将图像随机和水平垂直和水平缩放。

pixelRange = [-30 30];scaleRange = [0.9 1.1];imageAugmenter = imageDataAugmenter (...'randxreflection',真的,...'randxtranslation'pixelRange,...'randytranslation'pixelRange,...'randroatation',[ -  45 45],...'randxscale'scaleRange,...'randyscale',scalerange);

使用图像数据增强器创建包含训练数据的增强图像数据存储。若要自动将图像调整为网络输入大小,请指定网络输入大小的高度和宽度。这个例子使用了一个具有输入大小的网络[224 224 3]

InputSize = [224 224 3];Augimdstrain = AugmentedimageGedataStore(Inputsize(1:2),IMDstrain,“DataAugmentation”,imageaugmender);

要自动调整验证图像的大小而不执行进一步的数据增强,请使用增强图像数据存储,而无需指定任何其他预处理操作。

AugimdsValidation = AugmentedimageDataStore([224 224],IMDSValidation);

定义网络架构

使用自定义层定义具有六个残差块的剩余网络ResidualblockLayer..要访问此图层,请将示例打开为实时脚本。有关显示如何创建此自定义图层的示例,请参阅定义嵌套深度学习层

因为您必须指定输入层的输入大小dlnetwork.对象,您必须在创建图层时指定输入大小。要帮助确定到图层的输入大小,可以使用分析函数并检查前一层的激活的大小。

numfilters = 32;图层= [ImageInputLayer(InputSize)Convolution2dlayer(7,NumFilters,“步”2,'填充''相同的') groupNormalizationLayer ('全频道')Rubulayer MaxPooling2Dlayer(3,“步”2) residualBlockLayer(numFilters) residualBlockLayer(numFilters) residualBlockLayer(2*numFilters)“步”2,'包括kipconvolution',真正的)residualBlockLayer (2 * numFilters) residualBlockLayer (4 * numFilters,“步”2,'包括kipconvolution',True)ResideLblockLayer(4 * NumFilters)GlobalaveragePooling2Dlayer全连接层(NumClasses)SoftMaxLayer ClassificationLayer]
图层数组:1”的形象输入224×224×3图片zerocenter正常化2”卷积32 7×7旋转步(2 - 2)和填充“相同”3“集团标准化规范化4”ReLU ReLU 5”麦克斯池3×3马克斯池步(2 - 2)和填充[0 0 0 0]6”残块残块与32个过滤器,step 1 7 " Residual Block Residual Block with 32 filters, stride 1 8 " Residual Block Residual Block with 64 filters, stride 2, and skip convolution 9 " Residual Block Residual Block with 64 filters, stride 1 10 " Residual Block Residual Block with 128 filters, stride 2,12”Global Average Pooling Global Average Pooling全球平均池13”Fully Connected 5 Fully Connected layer 14”Softmax Softmax 15”Classification Output crossentropyex

列车网络的

指定培训选项:

  • 用128个小批量来训练网络。

  • 每个纪元都洗牌数据。

  • 每划次使用验证数据验证一次网络一次。

  • 显示绘图中的训练进度并禁用详细输出。

miniBatchSize = 128;numIterationsPerEpoch =地板(augimdsTrain.NumObservations / miniBatchSize);选择= trainingOptions (“亚当”...'minibatchsize',小匹马,...'洗牌''每个时代'...'vightationdata',augimdsvalidation,...'验证职业',numiterationsperepoch,...“阴谋”“训练进步”...'verbose',错误的);

使用培训网络Trainnetwork.功能。默认情况下,Trainnetwork.如果一个可用的GPU,则使用GPU,否则,它使用CPU。GPU培训需要并行计算工具箱™和支持的GPU设备。金宝app有关支持设备的信息,请参阅金宝appGPU通金宝app过发布支持(并行计算工具箱).属性也可以指定执行环境“ExecutionEnvironment”名称 - 值对参数培训选项

net = trainnetwork(augimdstrain,图层,选项);

评估培训的网络

计算网络在训练集(无数据增强)和验证集上的最终精度。准确率是网络正确分类图像的比例。

ypred =分类(net,augimdsvalidation);yvalidation = imdsvalidation.labels;精度=均值(ypred == yvalidation)
精度= 0.7230

在混乱矩阵中可视化分类精度。使用列和行摘要显示每个类的精度并回忆。

Figure ConfusionChart(YValidation,Ypred,...'rowsmumary''行标准化'...'placeSummary'“column-normalized”);

您可以使用以下代码显示具有预测标签的四个样本验证图像,以及具有这些标签的图像的预测概率。

idx = randperm(numel(imdsvalidation.files),4);数字为了i = 1:4子图(2,2,i)i = ReadImage(IMDSValidation,IDX(I));imshow(i)标签= ypred(idx(i));标题(“预测的课程:”+字符串(标签));结尾

参考

另请参阅

||

相关话题