列车网络的使用模型的功能
这个例子展示了如何创建和火车深入学习网络通过使用函数,而不是一个或一层图dlnetwork
。使用函数的优点是灵活地描述各种各样的网络。缺点是你必须完成更多的步骤,仔细准备您的数据。这个示例使用手写数字图像,分类的双重目标数字,确定每个数字从垂直的角度。
负荷训练数据
的digitTrain4DArrayData
函数加载图片,他们的数字标签,他们从垂直旋转角度。创建arrayDatastore
对象的图像、标签和角度,然后使用结合
函数来生成一个单一的数据存储,其中包含所有的训练数据。提取的类名称和数量非离散响应。
[XTrain, T1Train T2Train] = digitTrain4DArrayData;dsXTrain = arrayDatastore (XTrain IterationDimension = 4);dsT1Train = arrayDatastore (T1Train);dsT2Train = arrayDatastore (T2Train);dsTrain =结合(dsXTrain dsT1Train dsT2Train);一会=类别(T1Train);numClasses =元素个数(类名);numResponses =大小(T2Train, 2);numObservations =元素个数(T1Train);
从训练数据查看一些图像。
idx = randperm (numObservations, 64);我= imtile (XTrain (:,:,:, idx));图imshow(我)
定义深度学习模型
定义以下网络预测这两个标签和旋转角度。
一块convolution-batchnorm-ReLU 16 5-by-5过滤器。
两个convolution-batchnorm街区的一个分支与ReLU操作之间进行32 3 x3的过滤器
跳过连接与convolution-batchnorm块32 1×1的隆起。
结合两个分支使用添加了ReLU操作
回归的输出,一个分支完全连接操作的大小是1(响应)的数量。
分类输出,一个分支的完全连接操作10码(类)的数量和softmax操作。
定义并初始化模型参数和状态
为每个操作定义的参数,包括结构。使用格式parameters.OperationName.ParameterName
在哪里参数
阿,是结构体perationName
是操作的名称(例如“conv1”)和ParameterName
参数的名称(例如,“权重”)。
创建一个结构参数
包含模型参数。初始化使用的可学的重量和偏见initializeGlorot
和initializeZeros
例子函数,分别。初始化批量标准化抵消和尺度参数initializeZeros
和initializeOnes
例子函数,分别。
使用批处理执行培训和推理规范化操作,你还必须管理网络状态。预测之前,您必须指定数据集训练数据的均值和方差。创建一个结构状态
包含状态参数。批处理不能正常化统计数据dlarray
对象。初始化批量标准化训练有素的均值和方差州使用训练0
和的
函数,分别。
初始化实例函数附加到这个例子作为支持文件。金宝app
初始化参数第一卷积操作“conv1”。
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]);
初始化参数和国家首批规范化操作,“batchnorm1”。
parameters.batchnorm1。抵消= initializeZeros ([numFilters 1]);parameters.batchnorm1。规模= initializeOnes ([numFilters 1]);state.batchnorm1。TrainedMean = initializeZeros ([numFilters 1]);state.batchnorm1。TrainedVariance = initializeOnes ([numFilters 1]);
初始化参数的第二卷积操作,“conv2”。
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]);
初始化参数和国家第二批规范化操作,“batchnorm2”。
parameters.batchnorm2。抵消= initializeZeros ([numFilters 1]);parameters.batchnorm2。规模= initializeOnes ([numFilters 1]);state.batchnorm2。TrainedMean = initializeZeros ([numFilters 1]);state.batchnorm2。TrainedVariance = initializeOnes ([numFilters 1]);
初始化参数第三卷积操作,“conv3”。
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]);
初始化参数和国家第三批规范化操作,“batchnorm3”。
parameters.batchnorm3。抵消= initializeZeros ([numFilters 1]);parameters.batchnorm3。规模= initializeOnes ([numFilters 1]);state.batchnorm3。TrainedMean = initializeZeros ([numFilters 1]);state.batchnorm3。TrainedVariance = initializeOnes ([numFilters 1]);
初始化参数的卷积操作跳过连接,“convSkip”。
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]);
初始化参数和状态的批处理规范化操作跳过连接,“batchnormSkip”。
parameters.batchnormSkip。抵消= initializeZeros ([numFilters 1]);parameters.batchnormSkip。规模= initializeOnes ([numFilters 1]);state.batchnormSkip。TrainedMean = initializeZeros ([numFilters 1]);state.batchnormSkip。TrainedVariance = initializeOnes ([numFilters 1]);
初始化参数完全连接操作对应的分类输出,“fc1”。
深圳= [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]);
视图的结构参数。
参数
参数=结构体字段:conv1:(1×1结构)batchnorm1: [1×1 struct] conv2: [1×1 struct] batchnorm2: [1×1 struct] conv3: [1×1 struct] batchnorm3: [1×1 struct] convSkip: [1×1 struct] batchnormSkip: [1×1 struct] fc1: [1×1 struct] fc2: [1×1 struct]
查看“conv1”操作的参数。
parameters.conv1
ans =结构体字段:重量:[5×5×1×16 dlarray]偏见:[16×1 dlarray]
视图状态的结构参数。
状态
状态=结构体字段:batchnorm1:(1×1结构)batchnorm2: [1×1 struct] batchnorm3: [1×1 struct] batchnormSkip: [1×1 struct]
查看状态参数“batchnorm1”操作。
state.batchnorm1
ans =结构体字段:TrainedMean: [16×1 dlarray] TrainedVariance: [16×1 dlarray]
定义模型函数
创建函数模型
上市的例子,计算前面描述的深度学习模型的输出。
这个函数模型
将模型参数参数
输入数据,国旗doTraining
它指定是否为培训或预测模型应该返回输出,和网络状态。网络输出标签的预测,预测的角度,更新网络状态。
定义模型损失函数
创建函数modelLoss
上市的例子,使用该模型参数,mini-batch输入数据与相应的目标包含标签和角度,并返回损失,损失的梯度对可学的参数,并更新网络状态。
指定培训选项
指定培训选项。火车20世mini-batch大小为128。
numEpochs = 20;miniBatchSize = 128;
火车模型
使用minibatchqueue
处理和管理mini-batches图像。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
(在这个例子中定义)一个炎热的编码类标签。格式的图像数据维度标签
“SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。不格式添加到类的标签或角度。火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)。
兆贝可= minibatchqueue (dsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB””“”“]);
对于每一个时代,洗牌和遍历mini-batches数据的数据。在每次迭代结束时,显示培训进展。为每个mini-batch:
评估损失和梯度模型使用
dlfeval
和modelLoss
函数。更新网络参数使用
adamupdate
函数。
初始化参数为亚当。
trailingAvg = [];trailingAvgSq = [];
更新进度条的培训进度监控,计算训练迭代的总数。
numIterationsPerEpoch =装天花板(numObservations / miniBatchSize);numIterations = numIterationsPerEpoch * numEpochs;
初始化TrainingProgressMonitor
对象。因为计时器开始创建监视器对象时,确保你创建对象接近的训练循环。
监控= = trainingProgressMonitor(指标“损失”信息=“时代”包含=“迭代”);
火车模型。
时代= 0;迭代= 0;%循环时期。而时代< numEpochs & & ~班长。停止时代=时代+ 1;%洗牌数据。洗牌(兆贝可)%循环mini-batches而hasdata(兆贝可)& & ~班长。停止迭代=迭代+ 1;[X, T1, T2] =下一个(兆贝可);%损失评估模型,渐变,使用dlfeval和状态% modelLoss函数。(损失、渐变、状态)= dlfeval (@modelLoss、参数X, T1, T2,状态);%更新使用亚当优化网络参数。(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变…trailingAvg trailingAvgSq,迭代);%更新培训进度监控。recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=(时代+“的”+ numEpochs));班长。进步= 100 *迭代/ numIterations;结束结束
测试模型
测试模型的分类精度通过比较测试集上的预测与真正的标签和角度。管理测试数据集使用minibatchqueue
作为训练数据对象使用相同的设置。
[XTest, T1Test T2Test] = digitTest4DArrayData;dsXTest = arrayDatastore (XTest IterationDimension = 4);dsT1Test = arrayDatastore (T1Test);dsT2Test = arrayDatastore (T2Test);dst =结合(dsXTest dsT1Test dsT2Test);mbqTest = minibatchqueue (dst,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB””“”“]);
预测的标签和角度验证数据,遍历mini-batches和使用模型函数doTraining
选项设置为假
。存储预测类和角度。比较预测和真正的类和角并存储结果。
doTraining = false;classesPredictions = [];anglesPredictions = [];classCorr = [];angleDiff = [];%在mini-batches循环。而hasdata (mbqTest)% mini-batch读取的数据。[X, T1, T2] =下一个(mbqTest);%使用预测函数进行预测。(Y1, Y2) =模型(参数X, doTraining状态);%确定预测类。日元= onehotdecode (Y1,一会,1);classesPredictions = (classesPredictions Y1);% Dermine预测角度Y2 = extractdata (Y2);anglesPredictions = (anglesPredictions Y2);%比较预测和真正的类Y1Test = onehotdecode (T1,一会,1);classCorr = [classCorr Y1 = = Y1Test];%比较预测和真正的角度angleDiffBatch = Y2 - T2;angleDiff = [angleDiff extractdata(收集(angleDiffBatch))];结束
评估分类精度。
精度=意味着(classCorr)
精度= 0.9848
回归精度进行评估。
angleRMSE =√意味着(angleDiff ^ 2))
angleRMSE =单6.5363
视图的一些图片和他们的预测。显示预测的角度在绿色红色和正确的标签。
idx = randperm(大小(XTest, 4), 9);图为i = 1:9次要情节(3 3 i) i = XTest (:,:,:, idx(我));imshow (I)在深圳=大小(我,1);抵消= sz / 2;thetaPred = anglesPredictions (idx (i));情节(抵消* [1-tand (thetaPred) 1 +罐内(thetaPred)], [sz 0],“r——”)thetaValidation = T2Test (idx (i));情节(抵消* [1-tand (thetaValidation) 1 +罐内(thetaValidation)], [sz 0],“g——”)举行从标签=字符串(classesPredictions (idx (i)));标题(”的标签:“+标签)结束
模型函数
这个函数模型
将模型参数参数
,输入数据X
的国旗doTraining
它指定是否为培训或预测模型应该返回输出,和网络状态状态
。网络输出标签的预测,预测的角度,更新网络状态。
函数(Y1、Y2、状态)=模型(参数X, doTraining状态)%初始操作%卷积- conv1重量= parameters.conv1.Weights;偏见= parameters.conv1.Bias;Y = dlconv (X,重量、偏见、填充=“相同”);%批正常化,ReLU——batchnorm1 relu1抵消= 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);%的主要分支操作%卷积- conv2重量= parameters.conv2.Weights;偏见= parameters.conv2.Bias;YnoSkip = dlconv (Y,重量、偏见、填充=“相同”,步= 2);%批正常化,ReLU——batchnorm2 relu2抵消= parameters.batchnorm2.Offset;规模= parameters.batchnorm2.Scale;trainedMean = state.batchnorm2.TrainedMean;trainedVariance = state.batchnorm2.TrainedVariance;如果doTraining [YnoSkip、trainedMean trainedVariance] = batchnorm (YnoSkip、抵消、规模、trainedMean trainedVariance);%更新状态state.batchnorm2。TrainedMean = TrainedMean;state.batchnorm2。TrainedVariance = TrainedVariance;其他的YnoSkip = batchnorm (YnoSkip、抵消、规模、trainedMean trainedVariance);结束YnoSkip = relu (YnoSkip);%卷积- conv3重量= parameters.conv3.Weights;偏见= parameters.conv3.Bias;YnoSkip = dlconv (YnoSkip、重量、偏见、填充=“相同”);%批标准化——batchnorm3抵消= parameters.batchnorm3.Offset;规模= parameters.batchnorm3.Scale;trainedMean = state.batchnorm3.TrainedMean;trainedVariance = state.batchnorm3.TrainedVariance;如果doTraining [YnoSkip、trainedMean trainedVariance] = batchnorm (YnoSkip、抵消、规模、trainedMean trainedVariance);%更新状态state.batchnorm3。TrainedMean = TrainedMean;state.batchnorm3。TrainedVariance = TrainedVariance;其他的YnoSkip = batchnorm (YnoSkip、抵消、规模、trainedMean trainedVariance);结束%跳过连接操作%卷积,批正常化(跳过连接)- convSkip batchnormSkip重量= 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);结束%的最后操作%,ReLU——而且,relu4Y = YSkip + YnoSkip;Y = relu (Y);%完全连接,softmax(标签),fc1 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(损失、参数);结束
Mini-Batch预处理功能
的preprocessMiniBatch
使用以下步骤:预处理数据函数
提取图像数据从传入单元阵列和连接到一个数字数组。连接图像数据在四维空间增加了一个三维图像,作为单通道尺寸。
从传入细胞提取标签和角度数据数组和连接在第二维度分类数组和一个数字数组,分别。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数[X, T1, T2] = preprocessMiniBatch (dataX、dataT1 dataT2)%从细胞中提取图像数据和连接猫(X = 4, dataX {:});%从细胞中提取标签数据和连接T1 =猫(2,dataT1 {:});%从细胞中提取角数据和连接T2 =猫(2,dataT2 {:});%一个炎热的编码标签T1 = onehotencode (T1, 1);结束
另请参阅
dlarray
|sgdmupdate
|dlfeval
|dlgradient
|fullyconnect
|dlconv
|softmax
|线性整流函数(Rectified Linear Unit)
|batchnorm
|crossentropy
|minibatchqueue
|onehotencode
|onehotdecode