主要内容

minibatchqueue

为深度学习创建小批量

描述

使用一个minibatchqueue对象创建、预处理和管理使用自定义训练循环的小批数据。

一个minibatchqueue对象遍历数据存储,以提供适合使用自定义训练循环进行培训的格式的数据。该对象准备一个按需预处理的小批队列。使用一个minibatchqueue对象来自动将数据转换为dlarraygpuArray,将数据转换为不同的精度,或应用自定义函数来预处理数据。您可以在后台并行地准备数据。

在培训期间,您可以使用minibatchqueue对象。可以在每个训练时期开始时使用洗牌函数,并为每个训练迭代从队列中收集数据下一个函数。方法检查是否有数据留在队列中hasdata功能,重置空队列时的队列。

创造

描述

例子

兆贝可=小型批处理队列(ds创建一个minibatchqueue对象从输入数据存储中删除ds.中的小批量兆贝可有相同数量的变量作为结果在输入数据存储上。

例子

兆贝可=小型批处理队列(dsnumOutputs创建一个minibatchqueue对象从输入数据存储中删除ds和设置每个小批量中的变量数。使用MiniBatchFcn指定一个迷你批处理预处理函数,该函数的输出数量与输入数据存储的变量数量不同ds

例子

兆贝可=小型批处理队列(___、名称、值)使用名称-值选项设置一个或多个属性。例如,minibatchqueue(ds,“MiniBatchSize”,64,“PartialMiniBatchs”,“放弃”)将返回的小批量的大小设置为64,并丢弃任何小于64个观察值的小批量。

输入参数

全部展开

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

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

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

您可以通过检查的输出来确定输入数据存储的变量数阅读(ds).如果数据存储返回一个表,那么变量的数量就是表中变量的数量。如果数据存储返回单元格数组,那么变量的数量就是单元格数组第2维的大小。

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

例子:2

性质

全部展开

此属性是只读的。

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

例子:256

返回或丢弃未完成的小批量,指定为“回归”“丢弃”

如果观测的总数不能被整除MiniBatchSize的返回的最后一个小批下一个函数可以有少于MiniBatchSize观察。此属性指定如何处理任何部分迷你批,使用以下选项:

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

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

PartialMiniBatch“丢弃”如果您要求所有小批次的大小相同。

例子:“丢弃”

数据类型:字符|一串

此属性是只读的。

小批量预处理功能,指定为“整理”或者函数句柄。

的默认值MiniBatchFcn“整理”.这个函数将迷你批处理变量连接到数组中。

使用自定义函数的函数句柄预处理用于自定义培训的小批量。建议对热编码分类标签、填充序列数据、计算平均图像等进行预处理。如果数据由包含不同大小数组的单元格数组组成,则必须指定自定义函数。

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

在自定义函数中不建议执行以下操作。要重新生成所需的行为,请在创建minibatchqueue对象。

行动 推荐的属性
将变量强制转换为不同的数据类型。 输出
将数据移动到GPU。 OutputEnvironment
将数据转换为dlarray OutputAsDlarray
将数据格式应用于dlarray变量 迷你批处理格式

例子:@myCustomFunction

数据类型:字符|一串|function_handle

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

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

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

通过应用指定的函数来处理池中的小批量MiniBatchFcn. 进一步处理,包括应用输出OutputEnvironmentOutputAsDlarray,迷你批处理格式,不会发生在工人身上。

DispatchInBackground被设置为真正的,如果本地并行池当前未打开,则该软件使用当前设置打开本地并行池。不支持非本地池。金宝app你第一次打电话,泳池就会开放下一个

例子:真正的

数据类型:逻辑

此属性是只读的。

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

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

你必须确保。的价值输出不与价值观冲突OutputAsDlarrayOutputEnvironment属性。如果您指定OutputAsDlarray作为真正的1,检查指定的数据类型输出支持金宝appdlarray.如果您指定OutputEnvironment作为“图形”“自动”如果支持的G金宝appPU可用,请检查输出支持金宝appgpuArray(并行计算工具箱)

例子:{'single','single','logical'}

数据类型:字符|一串

此属性是只读的。

将小批处理变量转换为的标志dlarray,指定为数字或逻辑1真正的)或0)或作为数字或逻辑值的向量。

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

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

例子:(1 1 0)

数据类型:逻辑

此属性是只读的。

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

应用于dlarray变量。非dlarray小批处理变量必须有迷你批处理格式

避免错误,当你有一个混合dlarray和非dlarray变量时,必须通过提供包含每个小批处理变量条目的单元数组来为每个输出指定值。此单元格数组元素的顺序必须与返回的小批处理变量的顺序匹配。由指定的函数返回变量的顺序与此相同MiniBatchFcn。如果未为指定自定义函数MiniBatchFcn,它与底层数据存储返回变量的顺序相同。

例子:{‘SSCB’,”}

数据类型:字符|一串

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

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

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

  • “cpu”—返回CPU上的小批量变量

若要只返回GPU上的特定变量,请指定OutputEnvironment作为单元格数组,包含每个小批处理变量的条目。这个单元格数组元素的顺序必须与返回的小批处理变量的顺序匹配。这个顺序与由指定的函数返回的变量的顺序相同MiniBatchFcn. 如果未指定自定义MiniBatchFcn,其顺序与基础数据存储返回的变量相同。

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

例子:{gpu, cpu的}

数据类型:字符|一串

对象的功能

hasdata 确定minibatchqueue是否可以返回mini-batch
下一个 从minibatchqueue获取下一个小批量数据
隔断 分区minibatchqueue
重置 重置minibatchqueue以启动数据
洗牌 在minibatchqueue中洗牌数据

例子

全部折叠

使用一个minibatchqueue对象自动准备小批量的图像和分类标签,用于自定义训练循环中的训练。

创建一个数据存储。调用auimds生成包含两个变量的表:输入,其中包含图像数据响应,包含相应的分类标签。

auimds = augmentedImageDatastore([100 100],digitDatastore);=阅读(auimds);头(2)
ans =输入的响应  _______________ ________ { 100×100 uint8}{100×100 uint8} 0

创建一个minibatchqueue对象从auimds.设置MiniBatchSize财产256

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

兆贝可= minibatchqueue (auimds,...“MiniBatchSize”, 256,...“OutputAsDlarray”(1,0),...“MiniBatchFormat”,{“SSBC”},...“外部环境”,{“图形”“cpu”})

使用下一个命令功能获取小批量兆贝可

(X, Y) =下一个(兆贝可);

预处理数据使用minibatchqueue具有自定义的小批量预处理功能。自定义函数将传入图像数据在0和1之间缩放,并计算平均图像。

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

解压(“MerchData.zip”);imd = imageDatastore (“水星”...“包含子文件夹”符合事实的...“标签源”“foldernames”);

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

兆贝可= minibatchqueue (imd 2...“MiniBatchSize”, 16岁,...“MiniBatchFcn”@preprocessMiniBatch,...“OutputAsDlarray”, 0)
迷你批量创建:MiniBatchSize: 16 PartialMiniBatch: ` return ` MiniBatchFcn: @preprocessMiniBatch DispatchInBackground: 0 outputs: OutputCast: {'single' 'single'} OutputAsDlarray: [0 0] MiniBatchFormat: {'' ''} outputenenvironment: {'auto' 'auto'}

获取一个迷你批处理并显示迷你批处理中图像的平均值。

[X,averageImage]=下一个(mbq);imshow(平均图像)

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

函数[X,averageImage]=预处理小批量(XCell)X=cat(4,XCell{:});X=重新缩放(X,“InputMin”,0,“输入最大值”, 255);averageImage =意味着(X, 4);结束

使用以下方法训练网络minibatchqueue管理小批量的处理。

负荷训练数据

加载数字训练数据并将数据存储在数据存储器中。为使用的图像和标签创建一个数据存储arrayDatastore。然后,组合数据存储以生成一个单独的数据存储以供使用minibatchqueue

[XTrain, YTrain] = digitTrain4DArrayData;dsX = arrayDatastore (XTrain,“IterationDimension”4);dsY = arrayDatastore (YTrain);dsTrain =结合(dsX dsY);

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

类别=类别(YTrain);numClasses=numel(类);

定义网络

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

[imageInputLayer([28 28 1],]),“名字”“输入”“的意思是”意味着(XTrain 4)) convolution2dLayer(5年,20年“名字”“conv1”) reluLayer (“名字”“relu1”)卷积2层(3,20,“填充”,1,“名字”“conv2”) reluLayer (“名字”“relu2”)卷积2层(3,20,“填充”,1,“名字”“conv3”) reluLayer (“名字”“relu3”) fullyConnectedLayer (numClasses“名字”“俱乐部”) softmaxLayer (“名字”“softmax”));lgraph = layerGraph(层);

创建一个dlnetwork对象从层图。

dlnet = dlnetwork (lgraph);

定义模型梯度函数

创建helper函数modelGradients,列在示例的最后。函数以a作为输入dlnetwork对象dlnet和一小批输入数据dlX与相应的标签Y,并返回损失和损失相对于中可学习参数的梯度dlnet

指定培训选项

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

numEpochs = 10;miniBatchSize = 128;

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

情节=“培训进度”

创建minibatchqueue

使用minibatchqueue处理和管理小批量图像。为每个mini-batch:

  • 丢弃部分mini-batches。

  • 使用自定义小批量预处理功能preprocessMiniBatch(在本例的最后定义)一次性对类标签进行编码。

  • 使用标注标签格式化图像数据“SSCB”(空间、空间、通道、批次)。默认情况下minibatchqueue对象将数据转换为dlarray具有基础数据类型的对象仅有一个的.不要向类标签添加格式。

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

兆贝可= minibatchqueue (dsTrain,...“MiniBatchSize”miniBatchSize,...“PartialMiniBatch”“丢弃”...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,{“SSCB”});

列车网络的

使用自定义训练循环训练模型。对于每个epoch,当数据在minibatchqueue.使用adamupdate作用在每个历元结束时,显示训练进度。

初始化训练进度图。

如果情节= =“培训进度”figure lineLossTrain=动画线(“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”) ylabel (“损失”网格)结束

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

平均梯度=[];averageSqGrad=[];

培训网络。

迭代= 0;开始=抽搐;历元=1:numEpochs%洗牌数据。洗牌(兆贝可);Hasdata (mbq) iteration = iteration + 1;%读取小批量数据。[dlX Y] =下一个(兆贝可);使用dlfeval和%模型梯度辅助功能。(研究生,亏损)= dlfeval (@modelGradients, dlnet dlX Y);%使用Adam优化器更新网络参数。[dlnet,averageGrad,averageSqGrad]=更新日期(dlnet,grad,averageGrad,averageSqGrad,迭代);%显示训练进度。如果情节= =“培训进度”D =持续时间(0,0,toc(开始),“格式”“hh:mm:ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(“时代:”+时代+”,过去:“+ drawnow字符串(D))结束结束结束

模型梯度函数

modelGradientsHelper函数接受a作为输入dlnetwork对象dlnet和一小批输入数据dlX与相应的标签Y,并返回损失和损失相对于中可学习参数的梯度dlnet.要自动计算梯度,请使用dlgradient函数。

函数[梯度,损失]=模型梯度(dlnet,dlX,Y)dlYPred=正向(dlnet,dlX);损失=交叉熵(dlYPred,Y);梯度=dlgradient(损失,dlnet.Learnables);结束

Mini-Batch预处理功能

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

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

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

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

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