主要内容

minibatchqueue

为深度学习创建小批量

描述

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

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

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

创建

描述

例子

兆贝可= minibatchqueue (ds创建一个minibatchqueue对象从输入数据存储中获取ds.迷你批次兆贝可的结果有相同数量的变量在输入数据存储上。

例子

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

例子

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

输入参数

全部展开

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

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

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

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

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

例子:2

属性

全部展开

此属性是只读的。

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

例子:256

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

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

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

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

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

例子:“丢弃”

数据类型:字符|字符串

此属性是只读的。

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

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

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

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

在自定义函数中不建议执行以下操作。属性时设置相应的属性,即可重现所需的行为minibatchqueue对象。

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

例子:@myCustomFunction

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

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

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

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

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

DispatchInBackground设置为真正的,如果本地池当前未打开,则软件将使用当前设置打开本地并行池。不支持非本地存储池。万博1manbetx泳池会在你第一次打电话时开放下一个

例子:真正的

数据类型:逻辑

此属性是只读的。

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

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

你必须确保的值OutputCast是否与价值观相冲突OutputAsDlarrayOutputEnvironment属性。如果你指定OutputAsDlarray作为真正的1,检查指定的数据类型OutputCast由万博1manbetxdlarray.如果你指定OutputEnvironment作为“图形”“汽车”和支持的图形万博1manbetx处理器可用时,检查指定的数据类型OutputCast由万博1manbetxgpuArray(并行计算工具箱)

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

数据类型:字符|字符串

此属性是只读的。

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

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

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

例子:(1 1 0)

数据类型:逻辑

此属性是只读的。

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

应用的是迷你批处理格式dlarray变量。非dlarray小批处理变量必须具有MiniBatchFormat

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

例子:{‘SSCB’,”}

数据类型:字符|字符串

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

  • “汽车”—如果GPU上有mini-batch变量,则返回。否则,返回CPU上的迷你批处理变量。

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

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

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

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

例子:{gpu, cpu的}

数据类型:字符|字符串

对象的功能

hasdata 确定minibatchqueue是否可以返回mini-batch
下一个 从minibatchqueue中获取下一个迷你批数据
分区 分区minibatchqueue
重置 重置minibatchqueue以开始数据
洗牌 在minibatchqueue中Shuffle数据

例子

全部折叠

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

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

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

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

minibatchqueue对象的两个输出变量:图像和分类标签输入而且响应的变量auimds,分别。设置minibatchqueue对象将图像返回为格式化的dlarrayGPU。这些图像是单通道黑白图像。通过应用该格式添加单通道维度“SSBC”到批次。将标签返回为非dlarray在CPU上。

MBQ = minibatchqueue(auimds,...“MiniBatchSize”, 256,...“OutputAsDlarray”(1,0),...“MiniBatchFormat”, {“SSBC”},...“OutputEnvironment”, {“图形”“cpu”})

使用下一个用于从中获取小批量的函数兆贝可

[X,Y] = next(mbq);

对数据进行预处理minibatchqueue具有自定义小批量预处理功能。自定义函数在0到1之间重新调整传入图像数据的大小,并计算平均图像。

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

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

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

MBQ = minibatchqueue(imds,2,...“MiniBatchSize”, 16岁,...“MiniBatchFcn”@preprocessMiniBatch,...“OutputAsDlarray”, 0)
mbq = minibatchqueue,有2个输出和属性:迷你批量创建:MiniBatchSize: 16 PartialMiniBatch: 'return' MiniBatchFcn: @preprocessMiniBatch DispatchInBackground: 0 outputs: OutputCast: {'single' 'single'} OutputAsDlarray: [0 0] MiniBatchFormat: {'' ''} OutputEnvironment: {'auto' 'auto'}

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

[X,averageImage] = next(mbq);imshow (averageImage)

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

函数[X,averageImage] = preprocessMiniBatch(XCell) X = cat(4,XCell{:});X = rescale(X,“InputMin”0,“InputMax”, 255);averageImage = mean(X,4);结束

使用minibatchqueue管理小批量的加工。

负荷训练数据

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

[XTrain,YTrain] = digitTrain4DArrayData;dsX = arrayDatastore(XTrain,IterationDimension=4);dsY = arrayDatastore(YTrain);dsTrain = combine(dsX,dsY);

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

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

定义网络

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

layers = [imageInputLayer([28 28 1],Mean= Mean (XTrain,4)) convolution2dLayer(5,20) reluLayer convolution2dLayer(3,20,Padding=1) reluLayer convolution2dLayer(3,20,Padding=1) reluLayer fullyConnectedLayer(numClasses) softmaxLayer];lgraph = layerGraph(图层);

创建一个dlnetwork对象从图层图。

Net = dlnetwork(lgraph);

定义模型损失函数

创建helper函数modelLoss,在示例的末尾列出。该函数以a作为输入dlnetwork对象和一小批输入数据X有相应的标签Y,并返回损失以及损失相对于中可学习参数的梯度

指定培训项目

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

numEpochs = 10;miniBatchSize = 128;

将训练过程可视化。

情节=“训练进步”

创建minibatchqueue

使用minibatchqueue处理和管理小批量的图像。对于每个小批量:

  • 丢弃部分小批量。

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

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

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

mbq = minibatchqueue(dsTrain,...MiniBatchSize = MiniBatchSize,...PartialMiniBatch =“丢弃”...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat = [“SSCB”""]);

列车网络的

使用自定义训练循环训练模型。中的数据仍然可用时,对数据进行洗牌并在小批上进行循环minibatchqueue.方法更新网络参数adamupdate函数。在每个纪元结束时,显示训练进度。

初始化培训进度图。

如果情节= =“训练进步”figure lineLossTrain = animatedline(Color=[0.85 0.325 0.098]);Ylim ([0 inf]) xlabel(“迭代”) ylabel (“损失”网格)结束

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

averageGrad = [];averageSqGrad = [];

培训网络。

迭代= 0;开始= tic;epoch = 1:numEpochs% Shuffle数据。洗牌(兆贝可);Hasdata (mbq)迭代=迭代+ 1;读取小批数据。[X,Y] = next(mbq);计算模型损失和梯度使用dlfeval和帮助函数。[loss,grad] = dlfeval(@modelLoss,net,X,Y);使用Adam优化器更新网络参数。。[net,averageGrad,averageSqGrad] = adamupdate(net,grad,averageGrad,averageSqGrad,iteration);%显示培训进度。如果情节= =“训练进步”D = duration(0,0,toc(start),Format=“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(损失))标题(”时代:“+ epoch +,消失:"+字符串(D))现在绘制结束结束结束

模型损失函数

modelLossHelper函数接受输入adlnetwork对象和一小批输入数据X有相应的标签Y,并返回损失以及损失相对于中可学习参数的梯度.要自动计算梯度,请使用dlgradient函数。

函数[loss,gradients] = modelLoss(net,X,Y) YPred = forward(net,X);loss = crossentropy(YPred,Y);gradients = dlgradient(loss,net.Learnables);结束

小批量预处理功能

preprocessMiniBatch函数按照以下步骤对数据进行预处理:

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

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

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

函数[X,Y] = preprocessMiniBatch(XCell,YCell)从单元格数组中提取图像数据并连接到第四个单元维度来添加第三个单例维度,作为通道%的维度。X = cat(4,XCell{:});从单元格和级联中提取标签数据。Y = cat(2,YCell{:});单热编码标签。Y = onehotencode(Y,1);结束

版本历史

R2020b中介绍