主要内容

小公子

为深度学习创建小批量

描述

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

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

在培训期间,您可以使用该数据管理您的数据小公子对象。可以在每个训练时期开始时使用洗牌函数,并为每个训练迭代从队列中收集数据下一个功能。您可以使用hasdata功能,重置它是空的队列。

创建

描述

例子

MBQ.= minibatchqueue(ds创造一个小公子来自输入数据存储的对象ds.迷你批次MBQ.具有与结果相同的变量在输入数据存储上。

例子

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

例子

MBQ.= minibatchqueue(___,名称,值)使用名称-值选项设置一个或多个属性。例如,Minibatchqueue(DS,“Minibatchsize”,64,“PartialMinibatches”,“丢弃”)将返回的小批量的大小设置为64,并丢弃任何小于64个观察值的小批量。

输入参数

全部展开

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

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

迷你批量变量的数量,指定为正整数。缺省情况下,迷你批量变量的数量等于输入数据存储的变量数。

通过检查输出,您可以确定输入数据存储的变量数读(DS).如果数据存储返回表,则变量的数量是表的变量数。如果数据存储返回单元格数组,则变量的数量是单元数组的第二维的大小。

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

例子:2

特性

全部展开

此属性是只读的。

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

例子:256.

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

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

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

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

partialminibatch.“丢弃”如果您要求所有迷你批次都有相同的尺寸。

例子:“丢弃”

数据类型:烧焦|细绳

此属性是只读的。

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

的默认值MiniBatchFcn“collat​​e”. 此函数用于将小批量变量连接到数组中。

使用函数句柄到自定义函数以进行预处理批量进行定制培训。这样做是推荐用于单热编码分类标签,填充序列数据,计算平均图像等。如果数据包含包含不同大小阵列的单元阵列,则必须指定自定义函数。

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

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

行动 推荐的财产
将变量传递到不同的数据类型。 输送
将数据移动到GPU。 户外环境
将数据转换为dlarray. OutputAsDlarray
将数据格式应用于dlarray.多变的。 minibatchformat.

例子:@myCustomFunction

数据类型:烧焦|细绳|function_handle

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

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

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

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

什么时候派遣背景设置为真的如果本地池当前未打开,则该软件使用当前设置打开本地并行池。不支持非本地池。金宝app池首次打电话给泳池下一个

例子:真的

数据类型:逻辑

此属性是只读的。

每个小批量变量的数据类型,指定为“单身”'双倍的'“int8”“int16”'int32''int64''uint8''uint16'“uint32”“uint64”“逻辑”, 要么“字符”或这些值的小区阵列或空向量。

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

你必须确保。的价值输送不与OutputAsDlarray要么户外环境属性。如果您指定OutputAsDlarray作为真的要么1,检查输送得到了金宝app支持dlarray..如果您指定户外环境作为“GPU”要么“汽车”和支持的GP金宝appU可用,检查所指定的数据类型输送得到了金宝app支持GPUArray.(并行计算工具箱)

例子:{'单身','单','逻辑'}

数据类型:烧焦|细绳

此属性是只读的。

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

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

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

例子:[1,1,0]

数据类型:逻辑

此属性是只读的。

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

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

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

例子:{'sscb',''}

数据类型:烧焦|细绳

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

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

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

  • '中央处理器'- 返回CPU上的迷你批量变量

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

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

例子:{gpu, cpu的}

数据类型:烧焦|细绳

对象的功能

hasdata 确定minibatchqueue是否可以返回mini batch
下一个 获取MinibatchQueue的下一个迷你数据
划分 分区小批量队列
重置 将MinibatchQuey重置为启动数据
洗牌 在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',{“图形”'中央处理器'})

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

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

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

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

解压缩(“MerchData.zip”); imds=图像数据存储(“merchdata”......“upplyubfolders”,真的,......“labelsource”'foldernames');

创建一个小公子使用自定义功能预处理数据preprocessMiniBatch在此示例结束时定义。自定义函数将图像数据连接到数字阵列中,重新分配在0到1之间的图像,并计算图像批次的平均值。该功能返回重新定义的图像和平均图像。设置输出的数量2,以匹配函数的输出数量。

MBQ = Minibatchqueue(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,平均值] =下一个(MBQ);imshow(平均值)

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

功能[x,普生图像] = preprocessminibatch(xcell)x = cat(4,xcell {:});x = Rescale(x,“inputmin”,0,“inputmax”,255);平均=平均值(x,4);结束

使用以下方法训练网络小公子管理Mini-Batches的处理。

负载培训数据

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

[XTrain,YTrain]=数字列车4DRARAYDATA;dsX=阵列数据存储(XTrain,'iteationdimension'4);DSY = ArrayDataStore(Ytrain);dstrain =联合(DSX,DSY);

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

Classes =类别(YTrain);numclasses = numel(类);

定义网络

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

[imageInputLayer([28 28 1],]),“名字”“输入”“的意思是”,平均(XTrain,4))卷积2层(5,20,“名字”'conv1') reluLayer (“名字”“relu1”)卷积2dlayer(3,20,“填充”1.“名字”“conv2”) reluLayer (“名字”'relu2')卷积2dlayer(3,20,“填充”1.“名字”'conv3') reluLayer (“名字”'relu3')全连接列(numcrasses,“名字”'fc')softmaxlayer(“名字”'softmax')];Lgraph = LayerGraph(层);

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

dlnet = dlnetwork (lgraph);

定义模型梯度函数

创建helper函数modelGradients,列在示例的末尾。该函数作为输入a数据链路网络对象DLNET.和迷你批次输入数据dlX有相应的标签Y,并返回损失和损失相对于中可学习参数的梯度DLNET.

指定培训选项

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

numepochs = 10;minibatchsize = 128;

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

情节=“培训 - 进展”

创建小公子

采用小公子处理和管理小批量图像。对于每个小批量:

  • 丢弃部分迷你批次。

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

  • 使用维标签格式化图像数据'SSCB'(空间,空间,频道,批量)。默认情况下,小公子对象将数据转换为dlarray.具有底层数据类型的对象单身的.不要向类标签添加格式。

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

mbq=小型批处理队列(dsTrain,......'minibatchsize',小批量,......'partialminibatch''丢弃'......'minibatchfcn'@preprocessMiniBatch,......'minibatchformat',{'SSCB'''});

列车网络的

使用自定义训练循环训练模型。对于每个历元,在数据仍然可用的情况下,洗牌数据并在小批量上循环小公子. 使用以下命令更新网络参数:adamupdate函数。在每个时代结束时,显示培训进度。

初始化培训进度情节。

如果plots ==“培训 - 进展”图lineloSstrain =动画线(“颜色”,[0.85 0.325 0.098]);ylim([0 inf])xlabel(“迭代”)ylabel(“损失”)网格结束

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

平均= [];averagesqgrad = [];

培训网络。

迭代=0;开始=抽搐;epoch = 1:numepochs%Shuffle数据。洗牌(兆贝可);尽管hasdata(mbq)迭代=迭代+1;%读取迷你批次数据。[DLX,Y] =下一个(MBQ);%使用dlfeval和dlfeval评估模型渐变和损失%模型梯度辅助功能。(研究生,亏损)= dlfeval (@modelGradients, dlnet dlX Y);%使用Adam优化器更新网络参数。[dlnet,sultergrad,averagesqgrad] = adamupdate(dlnet,毕业,普利特普拉德,平均qgrad,迭代);%显示训练进度。如果plots ==“培训 - 进展”d =持续时间(0,0,toc(start),'格式''hh:mm:ss'); 添加点(lineLossTrain、迭代、双(聚集(提取数据(丢失)))标题(“时代:”+时代+”,过去:“+字符串(d))绘制结束结束结束

模型梯度函数

modelGradients帮助函数作为输入a数据链路网络对象DLNET.和迷你批次输入数据dlX有相应的标签Y,并返回损失和损失相对于中可学习参数的梯度DLNET..要自动计算梯度,请使用Dlgradient.函数。

功能[梯度,损失] = MaposGRADENTERS(DLNET,DLX,Y)DLYPRED =前进(DLNET,DLX);损失=联肾上腺素(Dlypred,Y);梯度= DLGRADIET(损失,DLNET.LEALNABLE);结束

小批量预处理函数

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

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

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

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

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