主要内容

小公子

为深度学习创建小批量

描述

使用一个小公子用于创建,预处理和管理Mini-Batch的数据以进行培训,用于使用自定义培训循环进行培训。

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

在培训期间,您可以使用小公子目的。您可以使用每个培训epoch的开始时播放数据洗牌使用每个训练迭代的队列中的函数和收集数据下一个函数。方法检查是否有数据留在队列中哈迪塔功能,和重置它是空的队列。

创建

描述

例子

MBQ.= minibatchqueue (DS.创建一个小公子对象从输入数据存储中删除DS.。的mini-batchesMBQ.具有与结果相同的变量在输入数据存储上。

例子

MBQ.= minibatchqueue (DS.numOutputs创建一个小公子对象从输入数据存储中删除DS.并设置每个小批处理中的变量数量。使用时请使用此语法MiniBatchFcn指定一个迷你批处理预处理函数,该函数的输出数量与输入数据存储的变量数量不同DS.

例子

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

输入参数

全部展开

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

有关深入学习的数据存储的更多信息,请参阅深入学习的数据购物

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

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

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

例子:2

属性

全部展开

此属性是只读的。

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

例子:256

返回或丢弃不完整的迷你批次,指定为“回归”要么“丢弃”

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

  • “回归”- 迷你批量可以包含少于小匹匹匹匹配观察。返回所有数据。

    “丢弃”—所有小批量必须包含精确小匹匹匹匹配观察。如果没有足够的迷你批次,则可以从队列中丢弃一些数据。

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

例子:“丢弃”

数据类型:|字符串

此属性是只读的。

迷你批处理预处理功能,指定为“collat​​e”或者函数句柄。

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

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

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

在自定义函数内不建议使用以下操作。要重现所需的行为,请在创建时设置相应的属性小公子目的。

行动 推荐的财产
将变量强制转换为不同的数据类型。 OutputCast
将数据移动到GPU。 OutputEnvironment
将数据转换成dlarray. outputasdlarray.
将数据格式应用于dlarray.变量。 MiniBatchFormat

例子:@myCustomFunction

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

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

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

当迷你批次需要重型预处理时,请使用此选项。此选项使用并行池在培训期间使用Mini-Batches时在后台准备迷你批次。

通过应用指定的函数来处理池中的小批量MiniBatchFcn。进一步处理,包括应用的效果OutputCastOutputEnvironmentoutputasdlarray., 和MiniBatchFormat,不会发生在工人身上。

DispatchInBackground被设置为真的如果本地池当前未打开,则该软件使用当前设置打开本地并行池。不支持非本地池。万博1manbetx池首次打电话给泳池下一个

例子:真的

数据类型:逻辑

此属性是只读的。

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

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

你必须确保的价值OutputCast不与价值观冲突outputasdlarray.要么OutputEnvironment特性。如果您指定outputasdlarray.作为真的要么1,检查指定的数据类型OutputCast得到了万博1manbetx支持dlarray.。如果您指定OutputEnvironment作为“GPU”要么“汽车”且有支持的图万博1manbetx形处理器,请检查指定的数据类型OutputCast得到了万博1manbetx支持gpuArray(并行计算工具箱)

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

数据类型:|字符串

此属性是只读的。

标志将迷你批处理变量转换为dlarray.,指定为数字或逻辑1真的) 要么0.错误的)或作为数字或逻辑值的矢量。

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

转换为的变量dlarray.具有指定的底层数据类型OutputCast财产。

例子:[1,1,0]

数据类型:逻辑

此属性是只读的。

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

迷你批量格式应用于dlarray.只有变量。非-dlarray.迷你批量变量必须有一个MiniBatchFormat''

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

例子:{‘SSCB’,”}

数据类型:|字符串

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

  • '汽车'- 如果可用,则返回GPU上的迷你批量变量。否则,在CPU上返回Mini-Batch变量。

  • “图形”- 在GPU上返回Mini-Batch变量。

  • “cpu”- 返回CPU上的迷你批量变量

若要只返回GPU上的特定变量,请指定OutputEnvironment作为包含每个迷你批量变量的条目的单元阵列。此单元格数组的元素的顺序必须与返回迷你批次变量的顺序匹配。此顺序与从指定的函数返回的变量相同MiniBatchFcn。如果您没有指定自定义MiniBatchFcn,它与底层数据存储返回的变量的顺序相同。

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

例子:{gpu, cpu的}

数据类型:|字符串

对象功能

哈迪塔 确定minibatchqueue是否可以返回mini-batch
下一个 从minibatchqueue获取下一个mini-batch数据
分区 分区minibatchqueue
重置 将MinibatchQuey重置为启动数据
洗牌 在minibatchqueue中洗牌数据

例子

全部收缩

使用一个小公子对象自动准备迷你批次的图像和分类标签进行自定义训练循环培训。

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

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

创建一个小公子对象从auimds。设定小匹匹匹匹配财产256

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

MBQ = MinibatchQueue(Auimds,...“MiniBatchSize”,256,...'outcounasdlarray'(1,0),...'minibatchformat',{“SSBC”''},...“OutputEnvironment”,{“图形”“cpu”})

使用下一个命令功能获取小批量MBQ.

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

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

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

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

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

MBQ = Minibatchqueue(IMDS,2,...“MiniBatchSize”, 16岁,...“MiniBatchFcn”,@ preprocessminibatch,...'outcounasdlarray', 0)
迷你批量创建:MiniBatchSize: 16 PartialMiniBatch: ` return ` MiniBatchFcn: @preprocessMiniBatch DispatchInBackground: 0 outputs: OutputCast: {'single' 'single'} OutputAsDlarray: [0 0] MiniBatchFormat: {'' ''} outputenenvironment: {'auto' 'auto'}

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

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

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

功能[X,averageImage] = preprocessMiniBatch(XCell) X = cat(4,XCell{:});X =重新调节(X,“inputmin”0,“InputMax”,255);平均=平均值(x,4);结尾

使用培训网络小公子管理小批量的加工。

负载培训数据

加载数字训练数据并将数据存储在数据存储中。创建图像的数据存储以及使用标签的数据存储ArrayDataStore.。然后,将这些数据存储组合起来,生成一个要使用的数据存储小公子

[XTrain, YTrain] = digitTrain4DArrayData;dsX = arrayDatastore (XTrain,'iteationdimension'4);DSY = ArrayDataStore(Ytrain);dstrain =联合(DSX,DSY);

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

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

定义网络

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

[imageInputLayer([28 28 1],]),'名称''输入'“的意思是”意味着(XTrain 4)) convolution2dLayer(5年,20年'名称''conv1')剥离('名称'“relu1”20岁的)convolution2dLayer (3“填充”, 1'名称''conv2')剥离('名称'“relu2”20岁的)convolution2dLayer (3“填充”, 1'名称''conv3')剥离('名称'“relu3”)全连接列(numcrasses,'名称''fc')softmaxlayer('名称'“softmax”)];Lgraph = LayerGraph(层);

创建一个dlnetwork对象从层图。

dlnet = dlnetwork(3);

定义模型梯度函数

创建helper函数modelGradients,列在示例的末尾。该函数作为输入adlnetwork目的DLNET.以及一小批输入数据DLX.与相应的标签y,并返回关于可学习参数的丢失和损失的渐变DLNET.

指定培训选项

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

numepochs = 10;minibatchsize = 128;

可视化情节中的培训进度。

plots =.“训练进步”;

创建小公子

采用小公子处理和管理小批量图像。为每个mini-batch:

  • 丢弃部分mini-batches。

  • 使用自定义迷你批处理预处理功能Preprocessminibatch.(在此示例的末尾定义为单热编码类标签。

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

  • 在可用的GPU上进行训练。默认情况下,小公子对象将每个输出转换为agpuArray如果有可用的GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。万博1manbetx有关支持设备的信息,请参阅万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱)

兆贝可= minibatchqueue (dsTrain,...“MiniBatchSize”miniBatchSize,...'partialminibatch'“丢弃”...“MiniBatchFcn”,@ preprocessminibatch,...'minibatchformat',{“SSCB”''});

火车网络

使用自定义训练循环训练模型。对于每个epoch,当数据在小公子。使用adamupdate函数。在每个纪元的末尾,展示训练的进展情况。

初始化培训进度图。

如果plots ==“训练进步”figure lineosstrain = animatedline(“颜色”,[0.85 0.325 0.098]);ylim([0 inf])xlabel(“迭代”)ylabel(“损失”网格)结尾

初始化平均渐变和平均梯度。

averageGrad = [];averageSqGrad = [];

训练网络。

迭代= 0;开始=抽搐;为了时代= 1:numEpochs%Shuffle数据。洗牌(兆贝可);尽管Hasdata (mbq) iteration = iteration + 1;%读取小批数据。[DLX,Y] =下一个(MBQ);%使用dlfeval和dlfeval评估模型渐变和损失%MASEMGRADENTERS帮助函数。[毕业,损失] = dlfeval(@ maposgradients,dlnet,dlx,y);%使用Adam优化器更新网络参数。[dlnet, averageGrad averageSqGrad] = adamupdate (dlnet,研究生,averageGrad averageSqGrad,迭代);%显示培训进度。如果plots ==“训练进步”d =持续时间(0,0,toc(start),“格式”“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+ epoch +“,经过:”+字符串(d))绘制结尾结尾结尾

模型梯度函数

modelGradients帮助函数作为输入adlnetwork目的DLNET.以及一小批输入数据DLX.与相应的标签y,并返回关于可学习参数的丢失和损失的渐变DLNET.。要自动计算渐变,请使用Dlgradient.函数。

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

Mini-Batch预处理功能

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

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

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

  3. 单热编码分类标签到数字阵列中。编码到第一维度生成符合网络输出的形状的编码阵列。

功能[x,y] = preprocessminibatch(xcell,ycell)%从单元阵列提取图像数据并连接超过四分之一%维度添加第三个单例维度,作为频道%的维度。X = CAT(4,Xcell {:});%从单元格中提取标签数据并连接。y =猫(2,Ycell {:});%单热量编码标签。y = onehotencode(y,1);结尾
在R2020B中介绍