主要内容

小型批处理队列

为深度学习创建小批量

描述

使用小型批处理队列对象创建、预处理和管理用于使用自定义训练循环进行训练的小批量数据。

一个小型批处理队列对象在数据存储上迭代,以使用自定义训练循环以适当的格式提供用于训练的数据。对象准备一个按需预处理的小批量队列。使用小型批处理队列对象来自动将数据转换为dlarraygpuArray,将数据转换为其他精度,或应用自定义函数预处理数据。您可以在后台并行准备数据。

在培训期间,您可以使用小型批处理队列对象。可以在每个训练时期开始时使用洗牌函数,并为每个训练迭代从队列中收集数据下一个函数。您可以使用hasdata功能,重置当队列为空时,该队列将被删除。

创建

描述

例子

mbq= minibatchqueue (ds创建一个小型批处理队列对象从输入数据存储中删除ds.的mini-batchesmbq具有与结果相同数量的变量阅读在输入数据存储上。

例子

mbq= minibatchqueue (dsnumOutputs创建一个小型批处理队列对象从输入数据存储中删除ds并设置每个小批处理中的变量数量。使用时请使用此语法MiniBatchFcn指定一个小批量预处理函数,该函数的输出数与输入数据存储的变量数不同ds

例子

mbq= minibatchqueue (___,名称,值)使用名称-值选项设置一个或多个属性。例如,minibatchqueue (ds,“MiniBatchSize ", 64年,“PartialMiniBatches”、“丢弃”)将返回的小批量的大小设置为64,并丢弃任何小于64个观察值的小批量。

输入参数

全部展开

输入数据存储,指定为MATLAB®数据存储或自定义数据存储。

有关用于深度学习的数据存储的更多信息,请参见用于深度学习的数据存储

小批处理变量的数量,指定为正整数。默认情况下,迷你批处理变量的数量等于输入数据存储的变量数量。

的输出可以确定输入数据存储的变量数量阅读(ds)。如果数据存储返回一个表,则变量数为该表的变量数。如果数据存储返回一个单元格数组,则变量数为单元格数组第二维度的大小。

如果你使用MiniBatchFcn参数的名称-值,以指定一个迷你批处理预处理函数,该函数返回的变量数量与必须设置的输入数据存储不同numOutputs匹配函数的输出数量。

例子:2

属性

全部展开

此属性是只读的。

返回的小批量的大小下一个函数,指定为正整数。默认值为128

例子:256

返回或放弃不完整的小批量,指定为“回归”“丢弃”

如果观察的总数不能精确地除以小批量,返回的最后一个小批量下一个函数可以有少于小批量观察。此属性指定如何使用以下选项处理任何部分小批次:

  • “回归”—小批量可以包含小于小批量观察。返回所有数据。

    “丢弃”—所有小批量必须包含精确小批量观察。如果没有足够的数据来完成一个小批处理,则可以从队列中丢弃一些数据。

部分小批量“丢弃”如果你要求所有的小批量都是相同的尺寸。

例子:“丢弃”

数据类型:烧焦|字符串

此属性是只读的。

小批量预处理函数,指定为“核对”或函数句柄。

的默认值MiniBatchFcn“核对”。此函数将小型批处理变量连接到数组中。

使用自定义函数的句柄来预处理小批量,以进行自定义训练。这种方法推荐用于一次性编码分类标签、填充序列数据、计算平均图像等。如果数据由包含不同大小数组的单元格数组组成,则必须指定自定义函数。

如果指定自定义小批预处理函数,则该函数必须在预处理后将每批输出变量连接到一个数组中,并将每个变量作为单独的函数输出返回。函数必须接受至少与底层数据存储的变量数量相同的输入。输入被传递给自定义函数N-by-1单元阵列,其中N是小批处理中的观察数。该函数可以根据需要返回任意多个变量。如果MiniBatchFcn返回与输入不同数量的输出,请指定numOutputs为函数的输出数。

不建议在自定义函数中执行以下操作。要复制所需的行为,请在创建小型批处理队列对象。

行动 推荐属性
将变量强制转换为不同的数据类型。 OutputCast
将数据移动到GPU。 户外环境
将数据转换成dlarray OutputAsDlarray
将数据格式应用于dlarray变量。 MiniBatchFormat

例子:@myCustomFunction

数据类型:烧焦|字符串|function_handle

在并行池的后台对小批进行预处理,指定为数字或逻辑1符合事实的)或0).

使用此选项需要并行计算工具箱™。输入数据存储ds必须的分区。自定义数据存储必须实现matlab.io.datastore.Partitionable类。

当你的小批量需要大量的预处理时,使用这个选项。当您在培训期间使用小批量时,此选项使用并行池在后台准备小批量。

池中的工作人员通过应用MiniBatchFcn.进一步处理,包括应用的效果OutputCast户外环境OutputAsDlarrayMiniBatchFormat,不会发生在工人身上。

什么时候派遣背景设置为符合事实的,如果本地池当前未打开,软件将使用当前设置打开本地并行池。不支持非本地池。该池将在您第一次调用时打开金宝app下一个

例子:符合事实的

数据类型:逻辑

此属性是只读的。

每个小批量变量的数据类型,指定为“单身”“双人”“int8”“int16”“int32”“int64”‘uint8’‘uint16’“uint32”“uint64”“逻辑”,或“字符”,或包含这些值的单元格数组,或空向量。

如果您指定OutputCast作为空向量,每个小批处理变量的数据类型没有变化。要为每个小批变量指定不同的数据类型,请为每个小批变量指定包含条目的单元格数组。此单元格数组元素的顺序必须与返回的小批处理变量的顺序匹配。该顺序与由指定的函数返回变量的顺序相同MiniBatchFcn.如果没有指定自定义函数MiniBatchFcn,它与底层数据存储返回变量的顺序相同。

你必须确保。的价值OutputCast不与OutputAsDlarray户外环境属性。如果您指定OutputAsDlarray作为符合事实的1,检查OutputCast支持金宝appdlarray.如果您指定户外环境作为“gpu”“汽车”且有支持的图金宝app形处理器,请检查指定的数据类型OutputCast支持金宝appgpuArray(并行计算工具箱)

例子:{‘单身’,‘单身’,‘逻辑’}

数据类型:烧焦|字符串

此属性是只读的。

将小批量变量转换为的标志dlarray,指定为数字或逻辑1符合事实的)或0)或作为数值或逻辑值的向量。

要为每个输出指定不同的值,请为每个小批处理变量指定一个包含条目的向量。这个向量中元素的顺序必须与返回的小批处理变量的顺序匹配。该顺序与由指定的函数返回变量的顺序相同MiniBatchFcn.如果没有指定自定义函数MiniBatchFcn,它与底层数据存储返回变量的顺序相同。

转换为的变量dlarray属性指定的基础数据类型OutputCast财产。

例子:[1,1,0]

数据类型:逻辑

此属性是只读的。

小批量变量的数据格式,指定为字符向量或字符向量的单元格数组。

应用于dlarray仅限变量。非-dlarray小型批处理变量必须具有MiniBatchFormat属于

避免错误,当你有一个混合dlarray和非dlarray变量,则必须为每个输出指定一个值,方法是提供一个单元格数组,其中包含每个小批量变量的条目。此单元格数组元素的顺序必须与小批量变量的返回顺序匹配。这与从指定的函数返回变量的顺序相同MiniBatchFcn.如果没有指定自定义函数MiniBatchFcn,它与底层数据存储返回变量的顺序相同。

例子:{‘SSCB’,”}

数据类型:烧焦|字符串

使用返回的小型批处理变量的硬件资源下一个函数,指定为下列值之一:

  • “汽车”-返回GPU上的小批变量(如果有的话)。否则,返回CPU上的迷你批处理变量。

  • “图形”-在GPU上返回小批量变量。

  • “cpu”-在CPU上返回小批量变量

要仅返回GPU上的特定变量,请指定户外环境作为单元格数组,包含每个小批处理变量的条目。这个单元格数组元素的顺序必须与返回的小批处理变量的顺序匹配。这个顺序与由指定的函数返回的变量的顺序相同MiniBatchFcn.如果您没有指定自定义MiniBatchFcn,它与底层数据存储返回的变量的顺序相同。

使用GPU需要并行计算工具箱。要使用GPU进行深度学习,您还必须有支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU版金宝app本支持(并行计算工具箱)如果你选择“图形”选项和并行计算工具箱或合适的GPU不可用,则软件返回错误。

例子:{gpu, cpu的}

数据类型:烧焦|字符串

对象的功能

hasdata 确定minibatchqueue是否可以返回mini batch
下一个 从minibatchqueue获取下一个mini-batch数据
分区 分区小批量队列
重置 将minibatchqueue重置为数据的开始
洗牌 在minibatchqueue中洗牌数据

例子

全部崩溃

使用小型批处理队列对象自动准备小批量的图像和分类标签,用于自定义训练循环中的训练。

创建一个数据存储。调用阅读在…上auimds生成一个包含两个变量的表:输入,包含图像数据,以及响应,包含相应的分类标签。

auimds=增强图像数据存储([100],数字数据存储);A=读取(auimds);总目(A、2)
ans =输入的响应  _______________ ________ { 100×100 uint8}{100×100 uint8} 0

创建一个小型批处理队列反对auimds.设置小批量财产256

小型批处理队列对象有两个输出变量:来自对象的图像和分类标签输入响应的变量auimds,分别。设置小型批处理队列对象以将图像作为已格式化图像返回dlarray在GPU上。这些图像是单通道黑白图像。通过应用格式添加单通道维度“SSBC”批处理。返回标签为非dlarray在CPU上。

兆贝可= minibatchqueue (auimds,...“MiniBatchSize”, 256,...“OutputAsDlarray”,[1,0],...“MiniBatchFormat”,{“SSBC”},...“OutputEnvironment”,{“图形”“cpu”})

使用下一个函数从中获取小批量mbq

[X,Y]=下一个(mbq);

预处理数据使用小型批处理队列具有自定义小批量预处理功能。自定义功能可在0和1之间重新缩放传入图像数据,并计算平均图像。

解压缩数据并创建数据存储。

解压缩(“MerchData.zip”); imds=图像数据存储(“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

创建一个小型批处理队列使用自定义函数预处理数据的preprocessMiniBatch在本例的最后定义。自定义函数将图像数据连接到一个数字数组中,在0和1之间缩放图像,并计算批图像的平均值。该函数返回缩放后的一批图像和平均图像。设置输出的数量为2,以匹配函数的输出数量。

mbq=小型批处理队列(imds,2,...“MiniBatchSize”, 16岁,...“MiniBatchFcn”@preprocessMiniBatch,...“OutputAsDlarray”,0)
mbq=具有2个输出和属性的minibatchqueue:MiniBatch创建:MiniBatchSize:16 PartialMiniBatch:'return'MiniBatchFcn:@PreprocessMiniBatchDispatchInBackground:0输出:OutputCast:{'single''single'}OutputLarray:[0]MiniBatchFormat:{'''''}OutputEnvironment:{'auto''auto'}

获取一个小批量并显示小批量中图像的平均值。

[X, averageImage] =下一个(兆贝可);imshow (averageImage)

图中包含一个轴对象。axis对象包含一个image类型的对象。

作用[X,averageImage] = preprocessMiniBatch(XCell) X = cat(4,XCell{:});X =重新调节(X,“InputMin”,0,“InputMax”,255); 平均图像=平均值(X,4);结束

使用以下方法训练网络小型批处理队列管理小批量的加工。

负荷训练数据

加载数字训练数据并将数据存储在数据存储中。使用创建图像数据存储和标签数据存储arrayDatastore.然后,将这些数据存储组合起来,生成一个要使用的数据存储小型批处理队列

[XTrain,YTrain]=数字列车4DRARAYDATA;dsX=阵列数据存储(XTrain,“迭代维度”,4); dsY=阵列数据存储(YTrain);dsTrain=联合收割机(dsX,dsY);

确定标签数据中唯一类的数量。

类=类别(YTrain);numClasses =元素个数(类);

定义网络

属性定义网络并指定平均图像值“的意思是”选项在图像输入层。

[imageInputLayer([28 28 1],]),“名字”“输入”“的意思是”,平均(XTrain,4))卷积2层(5,20,“名字”“conv1”) reluLayer (“名字”“relu1”20岁的)convolution2dLayer (3“填充”1.“名字”“conv2”) reluLayer (“名字”“relu2”20岁的)convolution2dLayer (3“填充”1.“名字”“conv3”) reluLayer (“名字”“relu3”)完全连接层(NumClass,“名字”“fc”)软MaxLayer(“名字”“softmax”)]; lgraph=层图(层);

创建一个数据链路网络对象从图层图中删除。

dlnet = dlnetwork (lgraph);

定义模型梯度函数

创建helper函数modelGradients,列在示例末尾。该函数将作为输入数据链路网络对象数据链路以及一小批输入数据dlX与相应的标签Y,并返回损失和损失相对于中可学习参数的梯度数据链路

指定培训选项

指定在培训期间使用的选项。

numEpochs=10;miniBatchSize=128;

在一个情节中想象训练的进展。

情节=“训练进步”

创建小型批处理队列

使用小型批处理队列处理和管理小批量图像。对于每个小批量:

  • 丢弃部分mini-batches。

  • 使用自定义小批量预处理功能preprocessMiniBatch(在本例末尾定义)对类标签进行热编码。

  • 使用尺寸标签格式化图像数据“SSCB”(spatial, spatial, channel, batch)。默认情况下,小型批处理队列对象将数据转换为dlarray具有底层数据类型的对象.不要向类标签添加格式。

  • 如果GPU可用,则在GPU上进行训练。默认情况下小型批处理队列对象将每个输出转换为gpuArray如果有可用的GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU版金宝app本支持(并行计算工具箱)

mbq=小型批处理队列(dsTrain,...“MiniBatchSize”,小批量,...“PartialMiniBatch”“丢弃”...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,{“SSCB”});

列车网络的

使用自定义训练循环训练模型。对于每个历元,在数据仍然可用的情况下,洗牌数据并在小批量上循环小型批处理队列。使用以下命令更新网络参数:adamupdate函数。在每个纪元的末尾,展示训练的进展情况。

初始化培训进度图。

如果阴谋==“训练进步”figure lineosstrain = animatedline(“颜色”,[0.85 0.325 0.098]); ylim([0 inf])xlabel(“迭代”)伊拉贝尔(“损失”)网格在…上结束

初始化平均梯度和平方平均梯度。

averageGrad = [];averageSqGrad = [];

培训网络。

迭代=0;开始=抽搐;时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);虽然hasdata(mbq)迭代=迭代+1;%读取小批数据。[dlX,Y]=下一个(mbq);%使用dlfeval和%模型梯度辅助功能。(研究生,亏损)= dlfeval (@modelGradients, dlnet dlX Y);%使用Adam优化器更新网络参数。[dlnet, averageGrad averageSqGrad] = adamupdate (dlnet,研究生,averageGrad averageSqGrad,迭代);%显示训练进度。如果阴谋==“训练进步”D=持续时间(0,0,toc(开始),“格式”“hh: mm: ss”); 添加点(lineLossTrain、迭代、双(聚集(提取数据(丢失)))标题(”时代:“+时代+”,过去:“+字符串(D)现在开始结束结束结束

模型梯度函数

modelGradientshelper函数接受一个数据链路网络对象数据链路以及一小批输入数据dlX与相应的标签Y,并返回损失和损失相对于中可学习参数的梯度数据链路.要自动计算梯度,请使用梯度函数。

作用[gradient,loss] = modelGradients(dlnet,dlX,Y)损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);结束

小批量预处理函数

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

  1. 从传入的单元格数组中提取图像数据,并将数据连接到数字数组中。在第四维上连接图像数据会为每个图像添加一个第三维,用作单一通道维。

  2. 从传入的单元格数组中提取标签数据,并沿第二维度连接到分类数组中。

  3. 一种是将分类标签编码为数字数组。编码到第一维将生成一个编码数组,该数组与网络输出的形状相匹配。

作用(X, Y) = preprocessMiniBatch(伊势亚YCell)%从单元格数组中提取图像数据并连接到第四个单元格%维度添加第三个单例维度,作为通道%维度。猫(X = 4,伊势亚{:});%从单元格中提取标签数据并连接。Y =猫(2,YCell {:});%一次性编码标签。Y=onehotcode(Y,1);结束
介绍了R2020b