主要内容

向前

计算深度学习网络输出进行培训

描述

在训练和推理(预测)期间,一些深入学习的层的行为不同。例如,在训练期间,辍学层随机将输入元素随机设置为零,以帮助防止过度拟合,但在推理期间,丢弃层不会改变输入。

要计算用于训练的网络输出,请使用向前函数。为推理计算网络输出,请使用预测函数。

例子

海底= (dlnetdlX返回网络输出海底在培训期间给定输入数据dlX

海底= (dlnet、dlX1 dlXM……)返回网络输出海底在培训期间输入DLX1,...,DLXM和网络dlnet输入和单个输出。

[dly1,...,dlyn] =前进(___返回N输出dlY1、……dlYN在培训的网络中N使用前面任何语法的输出。

[dlY1,…,dlYK] = (___,'输出',layerNames返回输出dlY1、……dlYK在使用前面任何一种语法为指定层进行训练时。

___] = (___“加速度”,加速度除了前面语法中的输入参数外,还指定在训练期间使用的性能优化。

___状态] = (___还返回更新后的网络状态。

例子

全部折叠

这个例子展示了如何训练一个用自定义学习率计划来分类手写数字的网络。

如果trainingOptions不提供您需要的选项(例如,自定义学习率时间表),那么您可以使用自动区分定义自己的自定义培训循环。

这个例子训练一个网络用基于时间的衰减学习率计划:对于每个迭代,求解器使用学习率给定 ρ t ρ 0 1 + k t , 在哪里t是迭代次数, ρ 0 是初始学习率,和k是衰减的。

负荷训练数据

使用使用的图像数据存储将数字数据加载imageDatastore函数并指定包含图像数据的文件夹。

datafolder = fullfile(toolboxdir('nnet'),'nndemos'“nndatasets”“DigitDataset”);imd = imageDatastore (dataFolder,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

将数据分区为培训和验证集。使用该数据留出10%的数据进行验证splitEachLabel函数。

[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机”);

本例中使用的网络需要输入大小为28 × 28 × 1的图像。若要自动调整训练图像的大小,请使用增强图像数据存储。指定对训练图像执行的附加增强操作:在水平和垂直轴上随机平移图像,最多5个像素。数据增强有助于防止网络过拟合和记忆训练图像的准确细节。

输入= [28 28 1];PIXELRANGE = [-5 5];imageaugmenter = imagedataAugmenter(...'randxtranslation'pixelRange,...“RandYTranslation”,pixelrange);Augimdstrain = AugmentedimageGedataStore(Inputsize(1:2),IMDstrain,“DataAugmentation”, imageAugmenter);

要自动调整验证图像的大小而不执行进一步的数据增强,请使用增强图像数据存储,而无需指定任何其他预处理操作。

augimdsvalidation = augmentedimagedataStore(输入(1:2),IMDSValidation);

确定训练数据中的课程数量。

类=类别(imdsTrain.Labels);numClasses =元素个数(类);

定义网络

定义网络分类网络。

图层= [ImageInputLayer(InputSize,'正常化'“没有”“名字”“输入”)卷积2dlayer(5,20,“名字”“conv1”batchnormalizationlayer(“名字”“bn1”) reluLayer (“名字”“relu1”)卷积2dlayer(3,20,'填充'“相同”“名字”“conv2”batchnormalizationlayer(“名字”“bn2”) reluLayer (“名字”“relu2”)卷积2dlayer(3,20,'填充'“相同”“名字”“conv3”batchnormalizationlayer(“名字”“bn3”) reluLayer (“名字”“relu3”) fullyConnectedLayer (numClasses“名字”“俱乐部”) softmaxLayer (“名字”'softmax'));lgraph = layerGraph(层);

创建一个dlnetwork.来自图层图的对象。

dlnet = dlnetwork (lgraph)
[11×2 table] Learnables: [14×3 table] State: [6×3 table] InputNames: {'input'} OutputNames: {'softmax'}

定义模型梯度函数

创建函数modelGradients,并在示例的最后列出dlnetwork.对象,一个带有相应标签的小批输入数据,返回损耗相对于网络中可学习参数的梯度和相应的损耗。

指定培训选项

用128个小批量训练10个阶段。

numEpochs = 10;miniBatchSize = 128;

指定SGDM优化的选项。指定初始学习速率为0.01,衰减为0.01,动量为0.9。

initialLearnRate = 0.01;衰变= 0.01;动量= 0.9;

火车模型

创建一个minibatchqueue对象,该对象在训练期间处理和管理小批图像。为每个mini-batch:

  • 使用自定义小批量预处理功能preprocessMiniBatch(在本例末尾定义)将标签转换为一个热编码变量。

  • 使用尺寸标签格式化图像数据'SSCB'(空间、空间、通道、批处理)。默认情况下,minibatchqueue对象将数据转换为dlarray具有基础类型的对象.不要在类标签中添加格式。

  • 在GPU上培训如果有一个可用的。默认情况下,minibatchqueue对象将每个输出转换为GPUArray.图形处理器是否可用。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU通金宝app过发布支持(并行计算工具箱)

兆贝可= minibatchqueue (augimdsTrain,...'minibatchsize',小匹马,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,{'SSCB'''});

初始化培训进度图。

figure lineLossTrain = animatedline('颜色'[0.85 0.325 0.098]);ylim([0正])包含(“迭代”) ylabel (“损失”) 网格

初始化SGDM求解器的速度参数。

速度= [];

使用自定义训练循环训练网络。对于每个epoch,将数据和循环扫描迷你批次数据。为每个mini-batch:

  • 评估模型梯度,状态和损失使用dlfevalmodelGradients功能和更新网络状态。

  • 确定基于时间的衰减学习速率计划的学习速率。

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

  • 显示训练进度。

迭代= 0;start = tic;%循环epochs。时代= 1:numEpochs%洗牌数据。洗牌(MBQ);%循环在迷你批次。Hasdata(MBQ)迭代=迭代+ 1;%读取迷你批次数据。[dlX, dlY] = next(mbq);%使用dlfeval和the评估模型的梯度、状态和损失%MapeSgrainers函数函数并更新网络状态。[梯度,状态,损失] = DLFeval(@ Maposgradients,Dlnet,DLX,DLY);dlnet.state = state;%确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);%使用SGDM Optimizer更新网络参数。[dlnet,速度]= sgdmupdate (dlnet、渐变速度,learnRate动量);%显示培训进度。D =持续时间(0,0,toc(开始),'格式''hh:mm:ss');Addpoints(LineLoSstrain,迭代,丢失)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束

测试模型

将验证集上的预测结果与真实标签进行比较,验证模型的分类精度。

训练后,对新数据进行预测不需要标签。创建minibatchqueue对象,只包含测试数据的预测器:

  • 如果需要忽略测试标签,则设置小批队列输出数为1。

  • 指定用于培训的相同百分比大小。

  • 方法对预测器进行预处理PreprocessminibatchPredictors.函数,在示例的末尾列出。

  • 对于数据存储的单个输出,请指定迷你批处理格式'SSCB'(空间、空间、通道、批处理)。

numoutputs = 1;mbqtest = minibatchqueue(augimdsvalidation,numoutputs,...'minibatchsize',小匹马,...“MiniBatchFcn”,@ preprocessminibatchpredictors,...“MiniBatchFormat”'SSCB');

循环遍历小批和分类图像使用模特预分规函数,在示例的末尾列出。

预测= modelPredictions (dlnet、mbqTest、类);

评估分类的准确性。

欧美= imdsValidation.Labels;准确度=平均(预测== YTest)
精度= 0.9530

模型梯度函数

modelGradients功能需要A.dlnetwork.对象dlnet,迷你批次输入数据dlX与相应的标签Y并返回到学习参数的损失梯度dlnet、网络状态和丢失。若要自动计算梯度,请使用dlgradient函数。

函数[gradients,state,loss] = modelGradients(dlnet,dlX,Y) [dlYPred,state] = forward(dlnet,dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);损失=双(收集(extractdata(损失)));结束

模型的预测函数

模特预分规功能需要A.dlnetwork.对象dlnet,一个minibatchqueue输入数据兆贝可和网络类,并通过迭代所有数据计算模型预测minibatchqueue对象。函数使用onehotdecode函数查找预测的得分最高的类。

函数预测=模型预测(dlnet,mbq,类)预测= [];hasdata(mbq) dlXTest = next(mbq);dlYPred =预测(dlnet dlXTest);YPred = onehotdecode (dlYPred、类1)';预测=[预测;YPred];结束结束

迷你批处理预处理功能

preprocessMiniBatch功能预处理使用以下步骤的迷你预测器和标签:

  1. 方法对图像进行预处理PreprocessminibatchPredictors.函数。

  2. 从传入单元格数组中提取标签数据并沿着第二维地连接到分类阵列中。

  3. 一次性将分类标签编码为数字数组。编码到第一个维度将生成一个与网络输出形状匹配的编码数组。

函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%提取来自单元格和连接的标签数据。Y = CAT(2,YCELL {1:结束});%一次热编码标签。Y, Y = onehotencode (1);结束

小批预测器预处理功能

PreprocessminibatchPredictors.功能预处理通过从输入单元阵列中提取图像数据并连接到数字阵列中的图像数据来预处理迷你批量预测器。对于灰度输入,在第四维上连接到每个图像的第三维度,用作单例通道维度。

函数X = preprocessMiniBatchPredictors(伊势亚)%连接。猫(X = 4,伊势亚{1:结束});结束

输入参数

全部折叠

用于自定义培训循环的网络,指定为dlnetwork.对象。

输入数据,指定为格式化数据dlarray.有关dlarray格式,请参见fmt输入参数的dlarray

层,指定为包含层名称的字符向量的字符串数组或单元格数组。

  • 如果layerNames(我)对应于具有单个输出的层layerNames(我)是图层的名称。

  • 如果layerNames(我)对应于具有多个输出的层,然后layerNames(我)是图层名称后跟角色“/以及输出图层的名称:'layername / outputname'

性能优化,指定为以下其中之一:

  • “汽车”—自动对输入的网络和硬件资源进行多项优化。

  • “没有”-禁用所有加速。

默认选项是“汽车”

使用“汽车”加速选项可以提供性能优势,但以增加初始运行时为代价。具有兼容参数的后续调用速度更快。当您计划使用具有相同大小和形状的不同输入数据多次调用函数时,请使用性能优化。

输出参数

全部折叠

输出数据,以格式化格式返回dlarray.有关dlarray格式,请参见fmt输入参数的dlarray

更新后的网络状态,作为表返回。

网络状态是一个有三列的表:

  • -层名,指定为字符串标量。

  • 参数-参数名称,指定为字符串标量。

  • 价值- 参数值,指定为adlarray对象。

网络状态包含了网络在迭代之间记忆的信息。例如,LSTM和批标准化层的状态。

更新dlnetwork.使用状态财产。

兼容性的考虑

展开全部

R2021a中行为改变

扩展能力

介绍了R2019b