列车网络使用型号功能

这个例子展示了如何创建和训练一个深度学习网络使用函数,而不是一个层图或adlnetwork。使用函数的优点是描述各种网络的灵活性。缺点是,你必须完成以上步骤,仔细准备数据。本例使用的手写体数字图像,以数字进行分类,并确定从垂直每个数字的角度的双重目标。

负荷训练数据

digitTrain4DArrayData函数加载图像,它们的数字标签,以及它们从垂直旋转角度。

[XTrain,YTrain,anglesTrain] = digitTrain4DArrayData;类名=类别(YTrain);numClasses = numel(类名);numObservations = numel(YTrain);

从训练数据查看一些图片。

IDX = randperm(numObservations,64);I = imtile(XTrain(:,:,:,IDX));图imshow(I)

定义深度学习模式

定义下列网络预测的标签,以及旋转角度。

  • 带有16个5×5过滤器的卷积-批处理- relu块。

  • 由两个卷积-batchnorm块组成的分支,每个块都有32个3×3的过滤器,中间有ReLU操作

  • 跳过与卷积batchnorm块连接用32 1乘1卷积。

  • 同时结合了分支机构使用加法后面是RELU操作

  • 对于回归输出,具有尺寸1(响应数)的完全连接操作的分支。

  • 对于分类输出,具有大小为10(类的数量)的完全连接操作的分支和SOFTMAX操作。

定义和初始化模型参数和状态

为每个操作定义参数,并将它们包含在一个结构中。使用格式parameters.OperationName.ParameterName哪里参数是该结构,O-perationName是操作的名称(例如“conv_1”)和ParameterName是参数的名称(例如,“Weights”)。

创建一个结构体参数包含模型参数。初始化使用示例功能可学习层的权重initializeGaussian在该示例的末尾列出。初始化用零的可学习层偏见。初始化批标准化偏移和比例参数与0和1分别。

要使用批处理规范化层执行训练和推理,还必须管理网络状态。在进行预测之前,必须指定来自训练数据的数据集平均值和方差。创建一个结构体包含的状态参数。初始化批标准化训练的均值和方差的培训与国零和一,分别。

parameters.conv1.Weights = dlarray(initializeGaussian([5,5,1,16]));parameters.conv1.Bias = dlarray(零(16,1,'单'));parameters.batchnorm1.Offset = dlarray(零(16,1,'单'));parameters.batchnorm1。1 = dlarray(的规模(16日,'单'));state.batchnorm1.TrainedMean =零(16,1,'单');state.batchnorm1.TrainedVariance =酮(16,1,'单');parameters.convSkip.Weights = dlarray(initializeGaussian([1,1,16,32]));parameters.convSkip.Bias = dlarray(零(32,1,'单'));parameters.batchnormSkip。抵消= dlarray (0 (32 1'单'));parameters.batchnormSkip.Scale = dlarray(酮(32,1,'单'));state.batchnormSkip.TrainedMean =零(32,1,'单');state.batchnormSkip.TrainedVariance =酮(32,1,'单');parameters.conv2.Weights = dlarray(initializeGaussian([3,3,16,32]));parameters.conv2.Bias = dlarray(零(32,1,'单'));parameters.batchnorm2.Offset = dlarray(零(32,1,'单'));parameters.batchnorm2。= dlarray(的规模(32 1'单'));state.batchnorm2.TrainedMean =零(32,1,'单');state.batchnorm2。TrainedVariance = 1 (32 1'单');parameters.conv3。重量= dlarray (initializeGaussian([3, 3, 32岁,32]));parameters.conv3。偏见= dlarray (0 (32 1'单'));parameters.batchnorm3.Offset = dlarray(零(32,1,'单'));parameters.batchnorm3.Scale = dlarray(酮(32,1,'单'));state.batchnorm3。TrainedMean = 0 (32 1'单');state.batchnorm3.TrainedVariance =酮(32,1,'单');parameters.fc2.Weights = dlarray(initializeGaussian([10,6272]));parameters.fc2.Bias = dlarray(零(numClasses,1,'单'));parameters.fc1。重量= dlarray (initializeGaussian ([6272]));parameters.fc1。偏见= dlarray (0 (1, - 1,'单'));

查看参数的结构。

参数
参数=结构体字段:器CONV1:[1×1结构] batchnorm1:[1×1结构] convSkip:[1×1结构] batchnormSkip:[1×1结构] CONV2:[1×1结构] batchnorm2:[1×1结构] conv3:[1×1结构] batchnorm3:[1×1结构] FC2:[1×1结构] FC1:[1×1结构]

查看“conv1”操作的参数。

parameters.conv1
ans =结构体字段:重量:[5×5×1×16 dlarray]偏压:[16×1 dlarray]

查看状态的结构。

状态=结构体字段:batchnorm1:[1×1结构] batchnormSkip:[1×1结构] batchnorm2:[1×1结构] batchnorm3:[1×1结构]

查看状态参数为“batchnorm1”操作。

state.batchnorm1
ans =结构体字段:被训练方差:[16×1单]

定义模型函数

创建功能模型,它计算前面描述的深度学习模型的输出。

功能模型取输入数据dlX,模型参数参数的国旗doTraining指定模型应该返回训练输出还是预测输出,以及网络状态。网络输出标签的预测,角度的预测,以及更新的网络状态。

定义模式渐变功能

创建功能modelGradients在该示例的末尾列出的,采用一个小批量的输入数据的dlX与相应的目标T1T2分别含有标签和角度,并返回损失的梯度相对于所述可学习的参数,更新后的网络状态,以及相应的损耗。

指定培训选项

指定培训选项。

numEpochs = 20;miniBatchSize = 128;地块=“训练进度”;numIterationsPerEpoch =地板(numObservations./miniBatchSize);

在GPU上火车(如果可用)。这需要并行计算工具箱™。使用GPU需要并行计算工具箱™和启用CUDA®GPUNVIDIA®计算能力3.0或更高版本。

executionEnvironment =“汽车”;

火车模型

培养使用自定义的训练循环模型。

对于每个纪元,洗牌数据和循环数据的小批。在每个阶段结束时,显示训练进度。

为每个mini-batch:

  • 转换的标签,以虚拟变量。

  • 转换的数据dlarray对象的基础类型为single,并指定维度标签'SSCB'(空间,空间信道,批次)。

  • 对于GPU训练,转换成gpuArray对象。

  • 评估模型梯度和使用损失dlfevalmodelGradients函数。

  • 属性更新网络参数adamupdate函数。

初始化训练进度情节。

如果地块==“训练进度”图lineLossTrain = animatedline('颜色'[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel(“损失”)网格结束

初始化参数亚当。

trailingAvg = [];trailingAvgSq = [];

火车模型。

迭代= 0;开始=抽动;%遍历时期。历元= 1:numEpochs%洗牌数据。IDX = randperm(numObservations);XTrain = XTrain(:,:,:,IDX);YTrain = YTrain(IDX);anglesTrain = anglesTrain(IDX);在小批量%环I = 1:numIterationsPerEpoch迭代=迭代+ 1;IDX =(I-1)* miniBatchSize + 1:我* miniBatchSize;%读取小批数据,并将标签转换为假的%变量。X = XTrain(:,:,:,IDX);Y1 =零(numClasses,miniBatchSize,'单');C = 1:numClasses Y1(C,YTrain(IDX)==类名(C))= 1;结束Y2 = anglesTrain(IDX)';Y2 =单(Y2);%转换小批量数据的dlarray。dlX = dlarray (X,'SSCB');%如果在GPU训练,然后数据转换为gpuArray。如果(执行环境==“汽车”&& canUseGPU) b| executionEnvironment ==“GPU”DLX = gpuArray(DLX);结束%评估模型梯度,状态和使用损失dlfeval和%modelGradients功能。[梯度,状态,损失] = dlfeval(@modelGradients,DLX,Y1,Y2,参数,状态);%更新使用ADAM优化网络参数。[参数,trailingAvg,trailingAvgSq] = adamupdate(参数,渐变...trailingAvg,trailingAvgSq,迭代);显示训练进度。如果地块==“训练进度”d =持续时间(0,0,TOC(开始),'格式','HH:MM:SS');addpoints(lineLossTrain,迭代,双(聚(ExtractData由(亏损))))标题(“时代”+时代+”,过去:“+串(d))的DrawNow结束结束结束

测试模型

通过对测试集的预测值与真实的标签和角度比较测试模型的分类精度

[XTest,欧美,anglesTest] = digitTest4DArrayData;

转换数据到dlarray与尺寸格式对象'SSCB'。对于GPU预测,也转换数据到gpuArray

dlXTest = dlarray (XTest,'SSCB');如果(执行环境==“汽车”&& canUseGPU) b| executionEnvironment ==“GPU”dlXTest = gpuArray(dlXTest);结束

为了预测验证数据的标签和角度,使用与该模型函数doTraining选项设置为

doTraining = FALSE;[dlYPred,anglesPred] =模型(dlXTest,参数,doTraining,状态);

评估分类精度。

[〜,IDX] = MAX(ExtractData由(dlYPred),[],1);labelsPred =类名(IDX);精度=平均值(labelsPred == YTest)
精度= 0.9852

评估回归精度。

(angleRMSE = sqrt(mean(extractdata(anglesPred) - anglesTest').^2))
angleRMSE = gpuArray单10.4900

查看一些图片与他们的预测。以红色显示的预测角度和绿色正确的标签。

IDX = randperm(大小(XTEST,4),9);数字I = 1:9的副区(3,3,i)的I = XTEST(:,:,:,IDX(I));imshow(我)抱深圳=大小(我,1);抵消= sz / 2;thetaPred = extractdata (anglesPred (idx (i)));情节(抵消* [1-tand (thetaPred) 1 +罐内(thetaPred)], [sz 0],'R--')thetaValidation = anglesTest(IDX(I));情节(偏移* [1-t和(thetaValidation)1 + t和(thetaValidation)],[SZ 0],'G - ')保持标记=串(labelsPred(IDX(I)));标题(”的标签:“+标签)结束

模型函数

功能模型取输入数据dlX,模型参数参数的国旗doTraining指定模型应该返回训练输出还是预测输出,以及网络状态。网络输出标签的预测,角度的预测,以及更新的网络状态。

功能[dlY1、dlY2] =模型(dlX、参数、doTraining状态)卷积%重量= parameters.conv1.Weights;偏见= parameters.conv1.Bias;海底= dlconv (dlX、权重、偏见,'填充'2);%批次正常化,RELU抵消= parameters.batchnorm1.Offset;规模= parameters.batchnorm1.Scale;trainedMean = state.batchnorm1.TrainedMean;trainedVariance = state.batchnorm1.TrainedVariance;如果doTraining [DLY,trainedMean,trainedVariance] = batchnorm(DLY,偏移,标度,trainedMean,trainedVariance);%更新状态state.batchnorm1.TrainedMean = trainedMean;state.batchnorm1.TrainedVariance = trainedVariance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束海底= relu(海底);%卷积,批标准化(跳过连接)重量= parameters.convSkip.Weights;偏见= parameters.convSkip.Bias;dlYSkip = dlconv(海底,重量、偏见,“步”2);偏移量= parameters.batchnormSkip.Offset;比例= parameters.batchnormSkip.Scale;trainedMean = state.batchnormSkip.TrainedMean;trainedVariance = state.batchnormSkip.TrainedVariance;如果doTraining [dlYSkip,trainedMean,trainedVariance] = batchnorm(dlYSkip,偏移,标度,trainedMean,trainedVariance);%更新状态state.batchnormSkip。TrainedMean = TrainedMean;state.batchnormSkip。TrainedVariance = TrainedVariance;其他的dlYSkip = batchnorm(dlYSkip,偏移,标度,trainedMean,trainedVariance);结束卷积%重量= parameters.conv2.Weights;偏见= parameters.conv2.Bias;海底= dlconv(海底,重量、偏见,'填充'1,“步”2);%批次正常化,RELU抵消= parameters.batchnorm2.Offset;规模= parameters.batchnorm2.Scale;trainedMean = state.batchnorm2.TrainedMean;trainedVariance = state.batchnorm2.TrainedVariance;如果doTraining [DLY,trainedMean,trainedVariance] = batchnorm(DLY,偏移,标度,trainedMean,trainedVariance);%更新状态state.batchnorm2.TrainedMean = trainedMean;state.batchnorm2.TrainedVariance = trainedVariance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束海底= relu(海底);卷积%权重= parameters.conv3.Weights;偏压= parameters.conv3.Bias;海底= dlconv(海底,重量、偏见,'填充',1);%批标准化偏移量= parameters.batchnorm3.Offset;比例= parameters.batchnorm3.Scale;trainedMean = state.batchnorm3.TrainedMean;trainedVariance = state.batchnorm3.TrainedVariance;如果doTraining [DLY,trainedMean,trainedVariance] = batchnorm(DLY,偏移,标度,trainedMean,trainedVariance);%更新状态state.batchnorm3.TrainedMean = trainedMean;state.batchnorm3.TrainedVariance = trainedVariance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束%的添加,RELUDLY = dlYSkip + DLY;海底= relu(海底);%完全连接(角度)权重= parameters.fc1.Weights;偏压= parameters.fc1.Bias;DLY2 = fullyconnect(DLY,重量,偏压);%完全连接,softmax(标签)权重= parameters.fc2.Weights;偏压= parameters.fc2.Bias;DLY1 = fullyconnect(DLY,重量,偏压);DLY1 = SOFTMAX(DLY1);结束

模型梯度函数

modelGradients函数,接受一小批输入数据dlX与相应的目标T1T2分别含有标签和角度,并返回损失的梯度相对于所述可学习的参数,更新后的网络状态,以及相应的损耗。

功能[梯度,状态,损失] = modelGradients(DLX,T1,T2,参数,状态)doTraining = TRUE;[DLY1,DLY2,状态] =模型(DLX,参数,doTraining,状态);lossLabels = crossentropy(DLY1,T1);lossAngles = MSE(DLY2,T2);损耗= lossLabels + 0.1 * lossAngles;梯度= dlgradient(损耗,参数);结束

权值初始化函数

initializeGaussian函数的样本权值来自一个均值为0,标准差为0.01的高斯分布。

功能参数= initializeGaussian(sz)'单')* 0.01。结束

另请参阅

|||||||||

相关话题