加快定制培训循环功能
这个例子展示了如何加速深循环学习自定义训练和预测功能。
当使用dlfeval
函数在一个自定义训练循环,软件每个输入痕迹dlarray
对象模型的损失函数来确定计算图用于自动分化。这种跟踪过程可能需要一些时间,可以花时间再计算相同的痕迹。通过优化、缓存和重用的痕迹,可以加速梯度计算的深度学习功能。您还可以优化、缓存和重用痕迹加速其他深度学习功能,不需要自动分化,例如您还可以加速模型用于预测函数和函数。
加快调用深度学习函数,使用dlaccelerate
函数来创建一个AcceleratedFunction
对象,自动优化、缓存和重用的痕迹。您可以使用dlaccelerate
函数来加速模型函数和模型直接损失函数,或加速这些函数使用的子功能。
返回的AcceleratedFunction
对象缓存调用底层函数的痕迹和重用缓存结果相同的输入模式时重新出现。
试着用dlaccelerate
函数调用:
是长时间运行的
有
dlarray
对象的结构dlarray
对象,或dlnetwork
对象作为输入没有副作用,如写入文件或显示输出
负荷训练和测试数据
的digitTrain4DArrayData
函数加载图片,他们的数字标签,他们从垂直旋转角度。创建arrayDatastore
对象的图像、标签和角度,然后使用结合
函数来生成一个单一的数据存储,其中包含所有的训练数据。提取的类名称和数量非离散响应。
[imagesTrain, labelsTrain anglesTrain] = digitTrain4DArrayData;dsImagesTrain = arrayDatastore (imagesTrain IterationDimension = 4);dsLabelsTrain = arrayDatastore (labelsTrain);dsAnglesTrain = arrayDatastore (anglesTrain);dsTrain =结合(dsImagesTrain dsLabelsTrain dsAnglesTrain);一会=类别(labelsTrain);numClasses =元素个数(类名);numResponses =大小(anglesTrain, 2);numObservations =元素个数(labelsTrain);
从训练数据查看一些图像。
idx = randperm (numObservations, 64);我= imtile (imagesTrain (:,:,:, idx));图imshow(我)
创建一个包含测试数据的数据存储digitTest4DArrayData
函数使用相同的步骤。
[imagesTest, labelsTest anglesTest] = digitTest4DArrayData;dsImagesTest = arrayDatastore (imagesTest IterationDimension = 4);dsLabelsTest = arrayDatastore (labelsTest);dsAnglesTest = arrayDatastore (anglesTest);dst =结合(dsImagesTest dsLabelsTest dsAnglesTest);
定义深度学习模型
定义以下网络预测这两个标签和旋转角度。
一块convolution-batchnorm-ReLU 16 5-by-5过滤器。
两个convolution-batchnorm街区的一个分支与ReLU操作之间进行32 3 x3的过滤器
跳过连接与convolution-batchnorm块32 1×1的隆起。
结合两个分支使用添加了ReLU操作
回归的输出,一个分支完全连接操作的大小是1(响应)的数量。
分类输出,一个分支的完全连接操作10码(类)的数量和softmax操作。
定义并初始化模型参数和状态
创建结构参数
和状态
包含初始化模型参数和状态,分别使用modelParameters
函数,列出的模型参数函数部分的例子。
使用格式的输出parameters.OperationName.ParameterName
在哪里参数
结构,啊perationName
是操作的名称(例如“conv1”)和ParameterName
参数的名称(例如,“权重”)。
(参数、状态)= modelParameters (numClasses numResponses);
定义模型函数
创建函数模型
上市的例子,计算前面描述的深度学习模型的输出。
这个函数模型
将模型参数参数
,输入数据X
的国旗doTraining
它指定是否为培训或预测模型应该返回输出,和网络状态状态
。网络输出标签的预测,预测的角度,更新网络状态。
定义模型损失函数
创建函数modelLoss
上市的例子,使用该模型参数,mini-batch的输入数据X
与相应的目标T1
和T2
分别包含标签和角度,并返回损失,损失的梯度对可学的参数,并更新网络状态。
指定培训选项
指定培训选项。火车20世mini-batch大小为32。显示情节可以让训练要花很长的时间来完成。通过设置禁用这个阴谋情节
变量来“没有”
。使情节,设置这个变量“训练进步”
。
numEpochs = 20;miniBatchSize = 32;情节=“没有”;
火车加速模型
加速模型损失函数使用dlaccelerate
函数。
accfun = dlaccelerate (@modelLoss);
清除任何previoulsy缓存加速功能使用的痕迹clearCache
函数。
clearCache (accfun)
使用minibatchqueue
处理和管理mini-batches图像。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
(在这个例子中定义)一个炎热的编码类标签。格式的图像数据维度标签
“SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。不格式添加到类的标签或角度。丢弃任何部分mini-batches返回一个时代的终结。
火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)。
兆贝可= minibatchqueue (dsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB”,”“,”“),…PartialMiniBatch =“丢弃”);
初始化参数为亚当。
trailingAvg = [];trailingAvgSq = [];
如果需要,初始化培训进展阴谋。
如果情节= =“训练进步”图lineLossTrain = animatedline(颜色= [0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)在结束
火车模型使用加速模型损失函数。对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:
评估损失和梯度模型使用
dlfeval
损失函数和加速模型。更新网络参数使用
adamupdate
函数。如果需要,更新培训进展阴谋。
迭代= 0;开始=抽搐;%循环时期。为时代= 1:numEpochs%洗牌数据。洗牌(兆贝可)%循环mini-batches而hasdata(兆贝可)迭代=迭代+ 1;[X, T1, T2] =下一个(兆贝可);%损失评估模型,使用dlfeval和渐变和状态%加速功能。(损失、渐变、状态)= dlfeval (accfun、参数X, T1, T2,状态);%更新使用亚当优化网络参数。(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变…trailingAvg trailingAvgSq,迭代);%显示培训进展。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);=双重损失(损失);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束
检查加速功能通过检查的效率HitRate
财产。的HitRate
属性包含函数调用的百分比,重用一个缓存的痕迹。
accfun.HitRate
ans = 99.9679
加速的预测
测量所需的时间使用测试数据集进行预测。
因为模型的预测函数需要一个mini-batch队列作为输入,功能不支持加速。金宝app加快预测,加速模型的功能。
加速模型函数使用dlaccelerate
函数。
accfun2 = dlaccelerate (@ model);
清除任何previoulsy缓存加速功能使用的痕迹clearCache
函数。
clearCache (accfun2)
训练后,使预测新数据不需要标签。创建minibatchqueue
对象只包含测试数据的预测:
忽略标签测试,设置输出的数量mini-batch队列1。
指定相同的mini-batch大小用于培训。
预处理预测使用
preprocessMiniBatchPredictors
函数,列出的例子。对于单一的输出数据存储,指定mini-batch格式
“SSCB”
(空间、空间、通道、批)。
numOutputs = 1;numOutputs mbqTest = minibatchqueue (dst,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatchPredictors,…MiniBatchFormat =“SSCB”);
循环mini-batches和使用的图像进行分类modelPredictions
函数,列出的例子。
[labelsPred, anglesPred] = modelPredictions (accfun2、参数、状态、mbqTest类名);
检查加速功能通过检查的效率HitRate
财产。的HitRate
属性包含函数调用的百分比,重用一个缓存的痕迹。
accfun2.HitRate
ans = 98.7261
模型参数函数
的modelParameters
函数创建结构参数
和状态
包含初始化模型参数和状态,分别为模型中描述定义深度学习模型部分。函数作为输入类的数量和数量的响应和初始化可学的参数。功能:
初始化层权值使用
initializeGlorot
函数初始化层使用的偏见
initializeZeros
函数初始化批量标准化抵消和尺度参数
initializeZeros
函数初始化批量标准化与尺度参数
initializeOnes
函数初始化批量正常化状态训练有素的意思
initializeZeros
函数初始化批量正常化状态训练有素的方差
initializeOnes
例子函数
初始化实例函数附加到这个例子作为支持文件。金宝app要访问这些文件,打开生活的脚本示例。学习更多关于初始化可学的深度学习模型的参数,看看初始化函数可学的参数模型。
使用格式的输出parameters.OperationName.ParameterName
在哪里参数
结构,啊perationName
是操作的名称(例如“conv1”)和ParameterName
参数的名称(例如,“权重”)。
函数(参数、状态)= modelParameters (numClasses numResponses)%的第一个回旋的层。filterSize = 5 [5];numChannels = 1;numFilters = 16;深圳= [filterSize numChannels numFilters];numOut =刺激(filterSize) * numFilters;numIn =刺激(filterSize) * numFilters;parameters.conv1。重量= initializeGlorot(深圳、numOut numIn);parameters.conv1。偏见= initializeZeros ([numFilters 1]);%第一批归一化层。parameters.batchnorm1。抵消= initializeZeros ([numFilters 1]);parameters.batchnorm1。规模= initializeOnes ([numFilters 1]);state.batchnorm1。TrainedMean = initializeZeros ([numFilters 1]);state.batchnorm1。TrainedVariance = initializeOnes ([numFilters 1]);%的第二个回旋的层。filterSize = 3 [3];numChannels = 16;numFilters = 32;深圳= [filterSize numChannels numFilters];numOut =刺激(filterSize) * numFilters;numIn =刺激(filterSize) * numFilters;parameters.conv2。重量= initializeGlorot(深圳、numOut numIn);parameters.conv2。偏见= initializeZeros ([numFilters 1]);%第二批归一化层。parameters.batchnorm2。抵消= initializeZeros ([numFilters 1]);parameters.batchnorm2。规模= initializeOnes ([numFilters 1]);state.batchnorm2。TrainedMean = initializeZeros ([numFilters 1]);state.batchnorm2。TrainedVariance = initializeOnes ([numFilters 1]);%回旋的第三层。filterSize = 3 [3];numChannels = 32;numFilters = 32;深圳= [filterSize numChannels numFilters];numOut =刺激(filterSize) * numFilters;numIn =刺激(filterSize) * numFilters;parameters.conv3。重量= initializeGlorot(深圳、numOut numIn);parameters.conv3。偏见= initializeZeros ([numFilters 1]);%第三批标准化层。parameters.batchnorm3。抵消= initializeZeros ([numFilters 1]);parameters.batchnorm3。规模= initializeOnes ([numFilters 1]);state.batchnorm3。TrainedMean = initializeZeros ([numFilters 1]);state.batchnorm3。TrainedVariance = initializeOnes ([numFilters 1]);%的卷积层跳过连接。filterSize = [1];numChannels = 16;numFilters = 32;深圳= [filterSize numChannels numFilters];numOut =刺激(filterSize) * numFilters;numIn =刺激(filterSize) * numFilters;parameters.convSkip。重量= initializeGlorot(深圳、numOut numIn);parameters.convSkip。偏见= initializeZeros ([numFilters 1]);%批标准化层跳过连接。parameters.batchnormSkip。抵消= initializeZeros ([numFilters 1]);parameters.batchnormSkip。规模= initializeOnes ([numFilters 1]);state.batchnormSkip。TrainedMean = initializeZeros ([numFilters 1]);state.batchnormSkip。TrainedVariance = initializeOnes ([numFilters 1]);%完全连接层对应分类的输出。深圳= [numClasses 6272];numOut = numClasses;numIn = 6272;parameters.fc1。重量= initializeGlorot(深圳、numOut numIn);parameters.fc1。偏见= initializeZeros ([numClasses 1]);%完全连接层对应回归的输出。深圳= [numResponses 6272];numOut = numResponses;numIn = 6272;parameters.fc2。重量= initializeGlorot(深圳、numOut numIn);parameters.fc2。偏见= initializeZeros ([numResponses 1]);结束
模型函数
这个函数模型
将模型参数参数
,输入数据X
的国旗doTraining
它指定是否为培训或预测模型应该返回输出,和网络状态状态
。网络输出标签的预测,预测的角度,更新网络状态。
函数(Y1、Y2、状态)=模型(参数X, doTraining状态)%卷积重量= parameters.conv1.Weights;偏见= parameters.conv1.Bias;Y = dlconv (X,重量、偏见、填充=“相同”);%批正常化,ReLU抵消= parameters.batchnorm1.Offset;规模= parameters.batchnorm1.Scale;trainedMean = state.batchnorm1.TrainedMean;trainedVariance = state.batchnorm1.TrainedVariance;如果doTraining [Y, trainedMean, trainedVariance] = batchnorm (Y,抵消,规模、trainedMean trainedVariance);%更新状态state.batchnorm1。TrainedMean = TrainedMean;state.batchnorm1。TrainedVariance = TrainedVariance;其他的Y = batchnorm (Y,抵消,规模、trainedMean trainedVariance);结束Y = relu (Y);%卷积,批正常化(跳过连接)重量= parameters.convSkip.Weights;偏见= parameters.convSkip.Bias;YSkip = dlconv (Y,重量、偏见、步幅= 2);抵消= parameters.batchnormSkip.Offset;规模= parameters.batchnormSkip.Scale;trainedMean = state.batchnormSkip.TrainedMean;trainedVariance = state.batchnormSkip.TrainedVariance;如果doTraining [YSkip、trainedMean trainedVariance] = batchnorm (YSkip、抵消、规模、trainedMean trainedVariance);%更新状态state.batchnormSkip。TrainedMean = TrainedMean;state.batchnormSkip。TrainedVariance = TrainedVariance;其他的YSkip = batchnorm (YSkip、抵消、规模、trainedMean trainedVariance);结束%卷积重量= parameters.conv2.Weights;偏见= parameters.conv2.Bias;Y = dlconv (Y,重量、偏见、填充=“相同”,步= 2);%批正常化,ReLU抵消= parameters.batchnorm2.Offset;规模= parameters.batchnorm2.Scale;trainedMean = state.batchnorm2.TrainedMean;trainedVariance = state.batchnorm2.TrainedVariance;如果doTraining [Y, trainedMean, trainedVariance] = batchnorm (Y,抵消,规模、trainedMean trainedVariance);%更新状态state.batchnorm2。TrainedMean = TrainedMean;state.batchnorm2。TrainedVariance = TrainedVariance;其他的Y = batchnorm (Y,抵消,规模、trainedMean trainedVariance);结束Y = relu (Y);%卷积重量= parameters.conv3.Weights;偏见= parameters.conv3.Bias;Y = dlconv (Y,重量、偏见、填充=“相同”);%批正常化抵消= parameters.batchnorm3.Offset;规模= parameters.batchnorm3.Scale;trainedMean = state.batchnorm3.TrainedMean;trainedVariance = state.batchnorm3.TrainedVariance;如果doTraining [Y, trainedMean, trainedVariance] = batchnorm (Y,抵消,规模、trainedMean trainedVariance);%更新状态state.batchnorm3。TrainedMean = TrainedMean;state.batchnorm3。TrainedVariance = TrainedVariance;其他的Y = batchnorm (Y,抵消,规模、trainedMean trainedVariance);结束%,ReLUY = YSkip + Y;Y = relu (Y);%完全连接,softmax(标签)重量= parameters.fc1.Weights;偏见= parameters.fc1.Bias;日元= fullyconnect (Y,重量,偏差);日元= softmax (Y1);%完全连接(角度)重量= parameters.fc2.Weights;偏见= parameters.fc2.Bias;Y2 = fullyconnect (Y,重量,偏差);结束
损失函数模型
的modelLoss
mini-batch函数模型参数的输入数据X
与相应的目标T1
和T2
分别包含标签和角度,并返回损失,损失的梯度对可学的参数,并更新网络状态。
函数(损失、渐变、状态)= modelLoss(参数X, T1, T2,状态)doTraining = true;(Y1、Y2、状态)=模型(参数X, doTraining状态);lossLabels = crossentropy (Y1, T1);lossAngles = mse (Y2, T2);损失= lossLabels + 0.1 * lossAngles;梯度= dlgradient(损失、参数);结束
模型的预测函数
的modelPredictions
函数模型参数、状态minibatchqueue
的输入数据兆贝可
网络类,计算模型遍历所有数据的预测minibatchqueue
对象。这个函数使用onehotdecode
函数找到预测类最高的分数。
函数[predictions1, predictions2] = modelPredictions (modelFcn、参数、状态、兆贝可类)doTraining = false;predictions1 = [];predictions2 = [];而hasdata(兆贝可)XTest =下一个(兆贝可);[YPred1, YPred2] = modelFcn(参数、XTest doTraining、状态);YPred1 = onehotdecode (YPred1、类1)';YPred2 = extractdata (YPred2)”;predictions1 = [predictions1;YPred1];predictions2 = [predictions2;YPred2];结束结束
Mini-Batch预处理功能
的preprocessMiniBatch
使用以下步骤:预处理数据函数
提取图像数据从传入单元阵列和连接到一个数字数组。连接图像数据在四维空间增加了一个三维图像,作为单通道尺寸。
从传入细胞提取标签和角度数据数组和连接在第二维度分类数组和一个数字数组,分别。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数[X, T,角]= preprocessMiniBatch(伊势亚、TCell angleCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%从细胞中提取标签数据和连接猫(T = 2, TCell {:});%从细胞中提取角数据和连接角=猫(2,angleCell {:});%一个炎热的编码标签T = onehotencode (T, 1);结束
Mini-Batch预测预处理功能
的preprocessMiniBatchPredictors
函数进行预处理mini-batch预测因子的提取图像数据从输入单元阵列,然后连接成一个数字数组。灰度输入,连接在第四维度添加每个图像的三维空间,作为一个单通道维度。
函数X = preprocessMiniBatchPredictors(伊势亚)%连接。猫(X = 4,伊势亚{1:结束});结束
另请参阅
dlaccelerate
|AcceleratedFunction
|clearCache
|dlarray
|dlgradient
|dlfeval