主要内容

使用周期性列车网络的学习速率对快照合奏

这个例子展示了如何训练一个网络分类的图像对象使用一个周期性的学习速率时间表和快照合奏更好的测试精度。在这个例子中,您将了解如何使用余弦函数的学习速率时间表,采取网络在训练的快照创建一个模型合奏,并添加L2-norm正规化(重量衰变)培训损失。

这个例子列车CIFAR-10上的残余网络[1]数据集和一个自定义的周期性的学习速率[2]:对于每一次迭代,求解器使用的学习速率转移余弦函数[3]α(t) = (alpha0/2) * cos(π*国防部(t - 1 t / M) / (t / M) + 1),在那里t是迭代数,T训练迭代的总数,alpha0最初的学习速率,是周期的数量/快照。这个学习速率计划有效地将培训过程分为周期。每个周期始于大学习速率衰减单调,迫使网络探索不同的局部最小值。在每个培训周期,你的快照网络(也就是说,您保存模型在这个迭代),后来所有快照模型的平均预测,也称为快照合奏[4],提高最终的测试精度。

准备数据

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

datadir = tempdir;downloadCIFARData (datadir);

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

[XTrain, TTrain XTest tt) = loadCIFARData (datadir);类=类别(TTrain);numClasses =元素个数(类);

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

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

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

图象尺寸= [32 32 3];pixelRange = 4 [4];imageAugmenter = imageDataAugmenter (RandXReflection = true,RandXTranslation = pixelRange,RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore(图象尺寸、XTrain TTrain,DataAugmentation = imageAugmenter);

定义网络体系结构

创建一个残余网络[1]有六个标准卷积单位(每阶段两个单位)和16的宽度。总网络深度2 * 6 + 2 = 14。此外,使用指定的平均图像的意思是选择在图像输入层。

netWidth = 16;层= [imageInputLayer(图象尺寸的意思= (XTrain 4) convolution2dLayer (3 netWidth填充=“相同”)batchNormalizationLayer reluLayer (Name =“reluInp”)convolutionalUnit (netWidth 1) additionLayer (Name =“add11”)reluLayer (Name =“relu11”)convolutionalUnit (netWidth 1) additionLayer (Name =“add12”)reluLayer (Name =“relu12”)convolutionalUnit (2 * netWidth, 2) additionLayer (Name =“add21”)reluLayer (Name =“relu21”)convolutionalUnit (2 * netWidth, 1) additionLayer (Name =“add22”)reluLayer (Name =“relu22”)convolutionalUnit (4 * netWidth, 2) additionLayer (Name =“add31”)reluLayer (Name =“relu31”)convolutionalUnit (4 * netWidth, 1) additionLayer (Name =“add32”)reluLayer (Name =“relu32”)globalAveragePooling2dLayer fullyConnectedLayer (numClasses) softmaxLayer];lgraph = layerGraph(层);lgraph = connectLayers (lgraph,“reluInp”,“add11 / in2”);lgraph = connectLayers (lgraph,“relu11”,“add12 / in2”);skip1 = [convolution2dLayer (1、2 * netWidth,跨步= 2,Name =“skipConv1”)batchNormalizationLayer (Name =“skipBN1”));lgraph = addLayers (lgraph skip1);lgraph = connectLayers (lgraph,“relu12”,“skipConv1”);lgraph = connectLayers (lgraph,“skipBN1”,“add21 / in2”);lgraph = connectLayers (lgraph,“relu21”,“add22 / in2”);skip2 = [convolution2dLayer (1、4 * netWidth跨步= 2,Name =“skipConv2”)batchNormalizationLayer (Name =“skipBN2”));lgraph = addLayers (lgraph skip2);lgraph = connectLayers (lgraph,“relu22”,“skipConv2”);lgraph = connectLayers (lgraph,“skipBN2”,“add31 / in2”);lgraph = connectLayers (lgraph,“relu31”,“add32 / in2”);

情节ResNet架构。

图绘制(lgraph)

创建一个dlnetwork对象的层图。

网= dlnetwork (lgraph);

定义模型损失函数

创建一个helper函数modelLoss最后,列出的例子。该函数在一个dlnetwork对象mini-batch的输入数据X与相应的标签T,并返回损失,损失的梯度参数对可学的和nonlearnable的状态参数的网络在给定迭代。

指定培训选项

指定培训选项。

  • 200年火车时代mini-batch大小为64。

  • 火车用个0.9的动力。

  • 规范使用重量衰减值的权重 1 0 - - - - - - 4

numEpochs = 200;miniBatchSize = 64;动量= 0.9;weightDecay = 1的军医;

确定权重的指数应用体重衰变。

idxWeights = ismember (net.Learnables.Parameter, (“重量”“规模”]);

个初始化参数优化。

速度= [];

指定培训选项特定于周期性的学习速率。alpha0最初的学习速率和吗numSnapshots是周期的数量或快照在训练。

alpha0 = 0.1;numSnapshots = 5;epochsPerSnapshot = numEpochs. / numSnapshots;numObservations =元素个数(TTrain);iterationsPerSnapshot =装天花板(numObservations. / miniBatchSize) * numEpochs. / numSnapshots;modelPrefix =“SnapshotEpoch”;

初始化训练图。

[lossLine, learnRateLine] = plotLossAndLearnRate;

火车模型

使用minibatchqueue在培训过程和管理mini-batches图像。为每个mini-batch:

  • 使用自定义mini-batch预处理功能preprocessMiniBatch(在这个例子中定义)一个炎热的编码类标签。

  • 格式的图像数据维度标签“SSCB”(空间、空间、通道、批)。默认情况下,minibatchqueue把数据转换为对象dlarray对象与基本类型。不格式添加到类的标签。

  • 火车在GPU如果一个是可用的。默认情况下,minibatchqueue将每个输出转换为对象gpuArray如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)

augimdsTrain。米iniBatchSize = miniBatchSize; mbqTrain = minibatchqueue(augimdsTrain,MiniBatchSize = MiniBatchSize,MiniBatchFcn = @preprocessMiniBatch,MiniBatchFormat = [“SSCB”,”“]);

加快modelLoss函数使用dlaccelerate

accfun = dlaccelerate (@modelLoss);

火车模型使用自定义训练循环。对于每一个时代,洗牌的数据存储,遍历mini-batches的数据,并保存模型(快照)如果当前时代的倍数epochsPerSnapshot。在每个时代,显示培训进展。为每个mini-batch:

  • 评估损失和梯度模型使用dlfeval和加速modelLoss函数。

  • 更新的状态nonlearnable网络参数。

  • 确定周期性的学习速率学习速率的时间表。

  • 更新网络参数使用sgdmupdate函数。

  • 在每一次迭代时情节损失和学习速率。

对于这个示例,训练了NVIDIA™泰坦RTX大约11个小时。

迭代= 0;开始=抽搐;%循环时期。时代= 1:numEpochs%洗牌数据。洗牌(mbqTrain);%保存快照模型。如果~国防部(时代,epochsPerSnapshot)保存(modelPrefix +时代+“.mat”,“净”);结束%在mini-batches循环。hasdata (mbqTrain)迭代=迭代+ 1;% mini-batch读取的数据。[X, T] =下一个(mbqTrain);%计算模型和梯度使用dlfeval损失% modelLoss加速功能。(损失、渐变、状态)= dlfeval (accfun,净,X, T, weightDecay idxWeights);%更新nonlearnable的状态参数。网。=状态;%确定周期性学习速率的时间表学习速率。learnRate = 0.5 * alpha0 * (cos((π*国防部(迭代1,iterationsPerSnapshot)。/ iterationsPerSnapshot)) + 1);%更新使用个优化网络参数。(净、速度)= sgdmupdate(净、渐变速度,learnRate动量);%显示培训进展。D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);addpoints (lossLine、迭代、双(损失))addpoints (learnRateLine,迭代,learnRate);sgtitle (”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束

创建快照合奏和测试模型

结合M的网络快照在训练形式最终合奏和测试模型的分类精度。集合预报对应的平均输出的完全连接层从所有M个人模型。

测试模型提供的测试数据CIFAR-10数据集。管理测试数据集使用minibatchqueue作为训练数据对象使用相同的设置。

augimdsTest = augmentedImageDatastore(图象尺寸、XTest tt);augimdsTest。米iniBatchSize = miniBatchSize; mbqTest = minibatchqueue(augimdsTest,MiniBatchSize = MiniBatchSize,MiniBatchFcn = @preprocessMiniBatch,MiniBatchFormat = [“SSCB”,”“]);

评估每个快照网络的准确性。使用modelPredictions函数定义的这个例子来遍历所有的数据在测试数据集。该函数返回的输出完全连接层的模型,预测类,与真正的类。

modelName =细胞(numSnapshots + 1, - 1);fcOutput = 0 (numClasses元素个数(tt), numSnapshots + 1);classPredictions =细胞(1,numSnapshots + 1);modelAccuracy = 0 (numSnapshots + 1, - 1);m = 1: numSnapshots modelName {m} = modelPrefix + m * epochsPerSnapshot;负载(modelName {m} +“.mat”);重置(mbqTest);[fcOutputTest, classPredTest classCorrTest] = modelPredictions(净、mbqTest、类);fcOutput(:,:,米)= fcOutputTest;classPredictions {m} = classPredTest;modelAccuracy (m) = 100 *意味着(classCorrTest);disp (modelName {m} +准确性:“+ modelAccuracy (m) +“%”)结束
SnapshotEpoch40精度:87.93% SnapshotEpoch80精度:89.92% SnapshotEpoch120精度:90.55% SnapshotEpoch160精度:90.67% SnapshotEpoch200精度:91.33%

确定整体网络的输出,计算完全连接的平均每个快照网络的输出。找到预测类从整体网络使用onehotdecode函数。与真正的课程评估的准确性。

fcOutput(:,:,最后)=意味着(fcOutput (:,:, 1: end-1), 3);classPredictions{结束}= onehotdecode (softmax (fcOutput(:,:,结束),类,1,“分类”);classCorrEnsemble = classPredictions{结束}= = tt ';modelAccuracy(结束)= 100 *意味着(classCorrEnsemble);modelName{结束}=“合奏模式”;disp (“整体精度:“+ + modelAccuracy(结束)“%”)
整体精度:91.74%

情节的准确性

情节上的精度测试数据集所有快照模型和整体模型。

图;酒吧(modelAccuracy);ylabel (“精度(%)”);xticklabels (modelName) xtickangle(45)标题(“模型准确性”)

辅助函数

损失函数模型

modelLoss函数在一个dlnetwork对象mini-batch的输入数据X,标签T、重量参数衰变和权重的指数衰减。函数返回损失、渐变和nonlearnable的状态参数。自动计算梯度,使用dlgradient函数。

函数(损失、渐变、状态)= modelLoss(净,X, T, weightDecay idxWeights) [Y,状态]=前进(净,X);损失= crossentropy (Y, T);% L2-regularization衰变(重量)allParams = net.Learnables (idxWeights:) value;L = dlupdate (@ (x)和(x) ^ 2,“所有”),allParams);L =总和(猫(1,L {:}));损失=损失+ weightDecay * 0.5 * L;梯度= dlgradient(损失、net.Learnables);结束

模型的预测函数

modelPredictions函数作为输入dlnetwork对象,一个minibatchqueue的输入数据兆贝可和计算模型预测通过遍历所有的数据minibatchqueue。这个函数使用onehotdecode函数找到预测类最高的分数,然后比较了预测与真正的类。函数返回网络输出类预测,和一个向量的1和0代表正确的和不正确的预测。

函数[rawPredictions, classPredictions classCorr] = modelPredictions(净、兆贝可类)rawPredictions = [];classPredictions = [];classCorr = [];hasdata(兆贝可)[X, T] =(兆贝可);%进行预测YPred =预测(净,X);rawPredictions = [rawPredictions extractdata(收集(YPred))];%转换为网络输出概率并确定预测%的类YPred = softmax (YPred);YPredBatch = onehotdecode (YPred类1);classPredictions = [classPredictions YPredBatch];%比较预测和真正的类T = onehotdecode (T,类,1);classCorr = [classCorr YPredBatch = = T);结束结束

情节丧失和学习速率函数

plotLossAndLearnRate功能initiliaizes情节显示损失和学习速率在每个迭代训练。

函数[lossLine, learnRateLine] = plotLossAndLearnRate图次要情节(2,1,1);lossLine = animatedline(颜色= [0.85 0.325 0.098]);标题(“损失”);包含(“迭代”)ylabel (“损失”网格)次要情节(2,1,2);learnRateLine = animatedline(颜色= 0.447 - 0.741 [0]);标题(“学习”);包含(“迭代”)ylabel (“学习”网格)结束

卷积单位函数

convolutionalUnit (numF步)函数创建一个数组的层两层卷积和相应的批规范化和ReLU层。numF卷积过滤器和数量吗是第一个卷积的步幅层。

函数层= convolutionalUnit (numF步幅)层= [convolution2dLayer (3 numF填充=“相同”,步=步)batchNormalizationLayer reluLayer convolution2dLayer (3 numF填充=“相同”)batchNormalizationLayer);结束

数据预处理功能

preprocessMiniBatch使用以下步骤:预处理数据函数

  1. 提取图像数据从传入单元阵列和连接到一个数字数组。连接图像数据在四维空间增加了一个三维图像,作为单通道尺寸。

  2. 从传入细胞提取标签数据数组和连接到一个直言沿着二维数组。

  3. 一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。

函数[X, T] = preprocessMiniBatch(伊势亚TCell)%从细胞中提取图像数据和连接猫(X = 4,伊势亚{:});%从细胞中提取标签数据和连接猫(T = 2, TCell {:});%一个炎热的编码标签T = onehotencode (T, 1);结束

引用

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

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

[3]Loshchilov, Ilya和弗兰克Hutter。“Sgdr:随机梯度下降法与温暖重启。”(2016).arXiv预印本arXiv: 1608.03983

[4]黄高,一轩,杰夫•Pleiss壮族Liu Kilian问:约翰·e·Hopcroft,温伯格。“快照集合体:火车1,得到m免费。”(2017).arXiv预印本arXiv: 1704.00109

另请参阅

|||||||||

相关的话题