用嵌套层训练深度学习网络
这个例子展示了如何用嵌套层训练网络。
要创建一个本身定义了层图的自定义层,可以指定dlnetwork
对象作为可学习参数。这种方法被称为网络的作文.你可以使用网络合成:
创建一个单独的自定义层,表示一个可学习层的块,例如,一个剩余块。
创建具有控制流的网络。例如,一个具有可以根据输入数据动态更改的部分的网络。
创建一个有循环的网络。例如,一个网络的各个部分将输出反馈给它自己。
有关更多信息,请参见深度学习网络组成.
这个例子展示了如何使用表示剩余块的自定义层来训练网络,每个层包含多个卷积、组归一化和具有跳过连接的ReLU层。这是一个展示如何创建剩余网络的示例没有使用自定义层,请参见图像分类残差网络训练.
残差连接是卷积神经网络体系结构中一个很受欢迎的元素。残余网络是一种具有绕过主网络层的残余(或捷径)连接的网络类型。使用剩余连接可以改善网络中的梯度流,并可以训练更深层次的网络。这种增加的网络深度可以在更困难的任务中产生更高的精度。
本例使用自定义层residualBlockLayer
,其中包含可学习的层块,由卷积层、组归一化层、ReLU层和加法层组成,还包括跳过连接和跳过连接中可选的卷积层和组归一化层。该图突出显示了剩余块结构。
下面的例子展示了如何创建自定义层residualBlockLayer
,请参阅定义嵌套深度学习层.
准备数据
下载并提取花数据集[1]。
url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile(下载文件夹,“flower_dataset.tgz”);imageFolder = fullfile(下载文件夹,“flower_photos”);如果~ datasetExists imageFolder disp ("正在下载Flowers数据集(218 MB)…") websave(文件名,url);解压(文件名,downloadFolder)结束
创建包含照片的图像数据存储。
datasetFolder = fullfile(imageFolder);imds = imageDatastore(数据文件夹,...IncludeSubfolders = true,...LabelSource =“foldernames”);
将数据划分为训练数据集和验证数据集。使用70%的图像进行训练,30%用于验证。
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,“随机”);
查看数据集的类数。
classes = categories(imds.Labels);numClasses = numel(类)
numClasses = 5
数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。控件调整图像的大小并增强图像以进行训练imageDataAugmenter
对象:
在垂直轴上随机反射图像。
随机将图像垂直和水平转换为30像素。
随机旋转图像到45度顺时针和逆时针。
随机缩放图像到垂直和水平的10%。
pixelRange = [-30 30];scaleRange = [0.9 1.1];imageAugmenter = imageDataAugmenter(...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange,...RandRotation = 45 [-45],...RandXScale = scaleRange,...RandYScale = scaleRange);
使用图像数据增强器创建包含训练数据的增强图像数据存储。若要自动将图像大小调整为网络输入大小,请指定网络输入大小的高度和宽度。这个例子使用了一个输入大小的网络[224 224 3]
.
inputSize = [224 224 3];augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain,DataAugmentation=imageAugmenter);
若要自动调整验证图像的大小,而不执行进一步的数据增强,请使用增强图像数据存储,而不指定任何额外的预处理操作。
augimdsValidation = augmentedImageDatastore([224 224],imdsValidation);
定义网络架构
使用自定义层定义带有六个剩余块的剩余网络residualBlockLayer
.要访问此层,请将示例作为活动脚本打开。有关显示如何创建此自定义层的示例,请参见定义嵌套深度学习层.
因为必须指定输入层的输入大小dlnetwork
对象时,在创建层时必须指定输入大小。属性可以帮助确定层的输入大小analyzeNetwork
函数并检查前一层激活的大小。
numFilters = 32;图层= [imageInputLayer(inputSize) convolution2dLayer(7,numFilters,Stride=2,Padding= .“相同”) groupNormalizationLayer (“所有渠道”reluLayer maxPooling2dLayer(3,Stride=2) residualBlockLayer(numFilters) residualBlockLayer(numFilters) residualBlockLayer(2*numFilters,Stride=2, incleskipconvolution =true) residualBlockLayer(2*numFilters) residualBlockLayer(4*numFilters,Stride=2, incleskipconvolution =true) residualBlockLayer(4*numFilters) globalAveragePooling2dLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]
layers = 15×1带有图层的图层数组: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个过滤器,跨步1 7“残块残块与32个过滤器,跨步1 8”与64年残块残块过滤器,跨步2,11 "残块残块128个滤波器,stride 1 12 " 2- d全局平均池2- d全局平均池13 " Fully Connected 5 Fully Connected layer 14 " Softmax Softmax 15 " Classification Output crossentropyex
列车网络的
指定培训方案:
用128个小批量训练网络。
对每个纪元的数据进行洗牌。
使用验证数据每个epoch验证一次网络。
输出验证损失最小的网络。
在图中显示训练进度,并禁用详细输出。
miniBatchSize = 128;numIterationsPerEpoch = floor(augimdsTrain.NumObservations/miniBatchSize);选项= trainingOptions(“亚当”,...MiniBatchSize = MiniBatchSize,...洗牌=“every-epoch”,...ValidationData = augimdsValidation,...ValidationFrequency = numIterationsPerEpoch,...OutputNetwork =“best-validation-loss”,...情节=“训练进步”,...Verbose = false);
训练网络使用trainNetwork
函数。默认情况下,trainNetwork
如果有GPU,则使用GPU,否则使用CPU。在GPU上进行训练需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU计算要求(并行计算工具箱).属性指定执行环境ExecutionEnvironment
选择trainingOptions
.
net = trainNetwork(augimdsTrain,layers,options);
评估训练网络
计算网络在训练集(没有数据增强)和验证集上的最终精度。准确率是指网络正确分类的图像的比例。
YPred =分类(net,augimdsValidation);YValidation = imdsValidation.Labels;accuracy = mean(YPred == YValidation)
准确度= 0.7530
在混淆矩阵中可视化分类精度。通过使用列和行摘要显示每个类的精度和召回率。
图confusionchart (YValidation YPred,...RowSummary =“row-normalized”,...ColumnSummary =“column-normalized”);
您可以使用以下代码显示四个带有预测标签的示例验证图像以及具有这些标签的图像的预测概率。
idx = randperm(numel(imdsValidation.Files),4);数字为i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(“预测班级:”+字符串(标签));结束
参考文献
另请参阅
checkLayer
|trainNetwork
|trainingOptions
|analyzeNetwork
|dlnetwork