此示例显示如何使用嵌套图层训练网络。
要创建自定义图层,本身定义了图层图,可以指定一个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));标题(“预测的课程:”+字符串(标签));结尾