主要内容

minibatchqueue

创建mini-batches深度学习

描述

使用一个minibatchqueue对象的创建、数据的预处理和管理mini-batches培训使用自定义循环。

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

在培训期间,您可以使用管理你的数据minibatchqueue对象。可以调整数据的每个时代使用培训洗牌功能和收集数据从队列中为每个迭代使用培训下一个函数。你可以检查任何数据队列中使用hasdata功能,重置队列是空的。

创建

描述

例子

兆贝可= minibatchqueue (ds)创建一个minibatchqueue从输入数据存储对象ds。的mini-batches兆贝可有相同数量的变量的结果吗在输入数据存储。

例子

兆贝可= minibatchqueue (ds,numOutputs)创建一个minibatchqueue从输入数据存储对象ds在每个mini-batch并设置变量的数量。当你使用使用这个语法MiniBatchFcn指定一个mini-batch预处理功能有不同数量的输出比输入数据存储的变量的数量ds

例子

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

输入参数

全部展开

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

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

mini-batch变量的数量,指定为一个正整数。默认情况下,mini-batch变量的数量等于输入数据存储的变量的数量。

您可以确定变量的数量输入数据存储的输出通过检查阅读(ds)。如果你的数据存储返回一个表,表的变量是变量的数量。如果你的数据存储返回一个单元阵列,变量的数量大小的细胞的二维数组。

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

例子:2

属性

全部展开

这个属性是只读的。

返回的mini-batches大小下一个函数,指定为一个正整数。默认值是128年

例子:256年

返回或丢弃不完整mini-batches,指定为“回归”“丢弃”

如果观测的总数不整除MiniBatchSize,最后mini-batch返回的下一个函数可以有不足MiniBatchSize观察。这个属性指定任何部分mini-batches如何治疗,使用以下选项:

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

    “丢弃”——所有mini-batches必须包含准确MiniBatchSize观察。一些数据可以从队列中被丢弃如果没有足够完成mini-batch。

PartialMiniBatch“丢弃”如果你要求所有mini-batches是相同的大小。

例子:“丢弃”

数据类型:字符|字符串

这个属性是只读的。

Mini-batch预处理功能,指定为“整理”或一个函数处理。

的默认值MiniBatchFcn“整理”。这个函数将mini-batch变量连接到阵列。

使用一个函数处理自定义函数来进行预处理mini-batches定制培训。这样做是推荐一个炎热的编码分类标签,填充序列数据,计算平均图像,等等。您必须指定一个自定义函数如果你的数据由细胞数组包含数组大小不同的。

如果您指定一个自定义mini-batch预处理功能,输出变量的函数必须连接每一批预处理后并返回数组每个变量作为一个单独的函数输出。函数必须接受至少尽可能多的输入变量的数量的底层数据存储。输入自定义函数的传递N1细胞阵列,Nmini-batch是观测的数量。函数可以返回需要尽可能多的变量。如果指定的函数MiniBatchFcn返回一个不同数量的输出比输入指定numOutputs作为函数的输出的数量。

下列行为不推荐在自定义函数。繁殖所需的行为,相反,当你创建设置相应的属性minibatchqueue对象。

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

例子:@myCustomFunction

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

在后台进行预处理mini-batches平行池,指定为一个数字或逻辑1(真正的)或0()。

使用这个选项需要并行计算工具箱™。输入数据存储ds必须subsettable或分区。使用这个选项,自定义数据存储应该实现matlab.io.datastore.Subsettable类。

使用这个选项,当你mini-batches需要沉重的预处理。这个选项使用并行池在后台准备mini-batches当你使用mini-batches在训练。

工人在池过程mini-batches通过应用指定的函数MiniBatchFcn。进一步的处理,包括应用的影响OutputCast,OutputEnvironment,OutputAsDlarray,MiniBatchFormat,不发生在工人。

DispatchInBackground被设置为真正的,软件打开一个本地平行池使用当前设置,如果当地游泳池不是当前打开的。不支持非本地池。万博1manbetx池打开你第一次电话下一个

例子:真正的

数据类型:逻辑

这个属性是只读的。

每个mini-batch变量的数据类型,指定为“单一”,“双”,“int8”,“int16”,“int32”,“int64”,“uint8”,“uint16”,“uint32”,“uint64”,“逻辑”,或“字符”、细胞数组的值或一个空向量。

如果您指定OutputCast作为一个空向量,每个mini-batch变量的数据类型不变。为每个mini-batch变量指定一个不同的数据类型,指定一个单元阵列为每个mini-batch变量包含一个条目。这个单元格数组的元素的顺序必须匹配的顺序返回mini-batch变量。这个顺序是相同的顺序返回的变量指定的函数MiniBatchFcn。如果你不指定一个自定义函数MiniBatchFcn,它是相同的顺序返回的变量是底层的数据存储。

你必须确保的价值OutputCast不冲突的价值观OutputAsDlarrayOutputEnvironment属性。如果您指定OutputAsDlarray作为真正的1检查指定的数据类型OutputCast支持万博1manbetxdlarray。如果您指定OutputEnvironment作为“图形”“汽车”和一个支持G万博1manbetxPU是可用的,检查指定的数据类型OutputCast支持万博1manbetxgpuArray(并行计算工具箱)

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

数据类型:字符|字符串

这个属性是只读的。

mini-batch变量转换为国旗dlarray指定为一个数字或逻辑1(真正的)或0()或一个向量的数字或逻辑值。

为每个输出指定一个不同的值,指定一个向量为每个mini-batch变量包含一个条目。这个向量的元素的顺序必须匹配的顺序返回mini-batch变量。这个顺序是相同的顺序返回的变量指定的函数MiniBatchFcn。如果你不指定一个自定义函数MiniBatchFcn,它是相同的顺序返回的变量是底层的数据存储。

转换成变量dlarray底层数据类型指定的吗OutputCast财产。

例子:(1 1 0)

数据类型:逻辑

这个属性是只读的。

mini-batch变量的数据格式,指定为一个字符特征向量的向量或一个单元阵列。

mini-batch格式应用于dlarray变量。非dlarray必须有一个mini-batch变量MiniBatchFormat

为了避免当你的一个错误dlarray和非dlarray为每个输出变量,您必须指定一个值通过提供一个单元阵列为每个mini-batch变量包含一个条目。这个单元格数组的元素的顺序必须匹配的顺序返回mini-batch变量。这是相同的顺序返回的变量指定的函数MiniBatchFcn。如果你不指定一个自定义函数MiniBatchFcn,它是相同的顺序返回的变量是底层的数据存储。

例子:{‘SSCB’,”}

数据类型:字符|字符串

硬件资源mini-batch变量返回使用下一个函数,指定为以下值之一:

  • “汽车”——返回mini-batch变量在GPU上如果有一个可用。否则,返回mini-batch变量在CPU上。

  • “图形”——返回mini-batch变量在GPU上。

  • “cpu”——返回mini-batch变量在CPU上

只返回特定变量的GPU,指定OutputEnvironment作为一个单元阵列为每个mini-batch变量包含一个条目。这个单元格数组的元素的顺序必须匹配的顺序返回mini-batch变量。这个顺序是相同的顺序返回的变量指定的函数MiniBatchFcn。如果你不指定一个自定义的MiniBatchFcn,它是相同的顺序返回的变量是底层的数据存储。

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

例子:{gpu, cpu的}

数据类型:字符|字符串

对象的功能

hasdata 确定minibatchqueue可以返回mini-batch
下一个 获取下一个mini-batch minibatchqueue的数据
分区 分区minibatchqueue
重置 重置minibatchqueue开始的数据
洗牌 洗牌minibatchqueue数据

例子

全部折叠

使用一个minibatchqueue对象自动mini-batches图像和分类标签准备培训在一个定制的循环。

创建一个数据存储。调用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”,},“OutputEnvironment”,{“图形”,“cpu”})

使用下一个函数获取mini-batches兆贝可

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

预处理数据使用minibatchqueue与一个定制mini-batch预处理功能。自定义函数重新调节传入的图像数据在0和1之间,并计算平均图像。

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

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

创建一个minibatchqueue。

  • 设置输出的数量2,以匹配函数的输出。

  • 设置mini-batch大小。

  • 预处理数据使用自定义函数preprocessMiniBatch定义在这个例子。自定义函数将图像数据连接到一个数值数组,0和1之间的重新调节图像,计算图像的批量的平均值。函数返回的新批图像和平均图像。

  • 应用预处理功能在后台使用并行池通过设置DispatchInBackground财产真正的。设置DispatchInBackground真正的需要并行计算工具箱™。

  • 不将mini-batch输出变量转换成dlarray

兆贝可= minibatchqueue (imd 2MiniBatchSize = 16,MiniBatchFcn = @preprocessMiniBatch,DispatchInBackground = true,OutputAsDlarray = false)
兆贝可= minibatchqueue 2输出和属性:Mini-batch创造:MiniBatchSize: 16 PartialMiniBatch:“返回”MiniBatchFcn: @preprocessMiniBatch DispatchInBackground: 1输出:OutputCast:{“单”“单身”}OutputAsDlarray: [0 0] MiniBatchFormat: {"} OutputEnvironment:{'汽车' '汽车'}

如果您使用的是DispatchInBackground和一个平行池不是已经打开,当地平行池将自动从mini-batch队列读取数据时开放。如果你的预处理功能是支持一个线程环境,开放并行线程池减少内存使用,更万博1manbetx快的调度,降低数据传输成本。有关更多信息,请参见在线程之间进行选择和基于流程的环境(并行计算工具箱)

parpool (“线程”);
开始平行池(parpool)使用“线程”概要文件…连接到平行池(工人数量:4)。

获得一个mini-batch和显示图像的平均mini-batch。一线工人应用预处理功能。

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

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

函数[X, averageImage] = preprocessMiniBatch(伊势亚)X =猫(4,伊势亚{:});X =重新调节(X, InputMin = 0, InputMax = 255);averageImage =意味着(X, 4);结束

训练一个网络使用minibatchqueue管理mini-batches的处理。

负荷训练数据

加载数字训练数据,并将数据存储在数据存储中。创建一个数据存储的图像,一个用于标签使用arrayDatastore。然后,结合生产数据存储一个数据存储使用minibatchqueue

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

确定独特的类标签的数据的数量。

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

定义网络

定义网络和使用指定图像的平均价值的意思是选择在图像输入层。

28层= [imageInputLayer([28 1],意思= (XTrain 4) convolution2dLayer (5、20) reluLayer convolution2dLayer(3、20、填充= 1)reluLayer convolution2dLayer(3、20、填充= 1)reluLayer fullyConnectedLayer (numClasses) softmaxLayer];lgraph = layerGraph(层);

创建一个dlnetwork对象的层图。

网= dlnetwork (lgraph);

定义模型损失函数

创建一个helper函数modelLoss最后,列出的例子。该函数作为输入dlnetwork对象和mini-batch输入数据X与相应的标签Y,并返回损失和损失的梯度对可学的参数

指定培训选项

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

numEpochs = 10;miniBatchSize = 128;

可视化培训进展阴谋。

情节=“训练进步”;

创建minibatchqueue

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

  • 丢弃部分mini-batches。

  • 使用自定义mini-batch预处理功能preprocessMiniBatch(在这个例子中定义)一个炎热的编码类标签。

  • 格式的图像数据维度标签“SSCB”(空间、空间、通道、批)。默认情况下,minibatchqueue把数据转换为对象dlarray与底层数据对象类型。不格式添加到类的标签。

  • 火车在GPU如果一个是可用的。默认情况下,minibatchqueue将每个输出转换为对象gpuArray如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)

兆贝可= minibatchqueue (dsTrain,MiniBatchSize = MiniBatchSize,PartialMiniBatch =“丢弃”,MiniBatchFcn = @preprocessMiniBatch,MiniBatchFormat = [“SSCB”,”“]);

列车网络的

火车模型使用自定义训练循环。对于每一个时代,洗牌数据和遍历mini-batches数据仍然是可用的minibatchqueue。更新网络参数使用adamupdate函数。在每个时代,显示培训进展。

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

averageGrad = [];averageSqGrad = [];

计算迭代的总数的培训进度监控。

numObservationsTrain =元素个数(YTrain);numIterationsPerEpoch =装天花板(numObservationsTrain / miniBatchSize);numIterations = numEpochs * numIterationsPerEpoch;

初始化TrainingProgressMonitor对象。因为计时器开始创建监视器对象时,确保你创建对象接近的训练循环。

如果情节= =“训练进步”监控= = trainingProgressMonitor(指标“损失”信息=“时代”包含=“迭代”);结束

培训网络。

迭代= 0;时代= 0;时代< numEpochs & & ~班长。停止时代=时代+ 1;%洗牌数据。洗牌(兆贝可);hasdata(兆贝可)& & ~班长。停止迭代=迭代+ 1;% mini-batch读取的数据。(X, Y) =下一个(兆贝可);%计算模型和梯度使用dlfeval损失% modelLoss helper函数。(损失、研究生)= dlfeval (@modelLoss净,X, Y);%更新使用亚当优化网络参数。[净,averageGrad averageSqGrad] = adamupdate(网络,毕业生,averageGrad averageSqGrad,迭代);%更新培训进度监控。如果情节= =“训练进步”recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=时代+“的”+ numEpochs);班长。进步= 100 *迭代/ numIterations;结束结束结束

损失函数模型

modelLoss辅助函数作为输入dlnetwork对象和mini-batch输入数据X与相应的标签Y,并返回损失和损失的梯度对可学的参数。自动计算梯度,使用dlgradient函数。

函数(损失,梯度)= modelLoss(净,X, Y) YPred =向前(净,X);损失= crossentropy (YPred Y);梯度= dlgradient(损失、net.Learnables);结束

Mini-Batch预处理功能

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

  1. 从传入的单元阵列中提取图像数据和将数据连接到一个数字数组。连接图像数据在四维空间增加了一个三维图像,作为单通道尺寸。

  2. 从传入单元阵列提取标签数据和连接第二个维度分类数组。

  3. 一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。

函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%从细胞中提取图像数据阵列和连接在第四%维度添加第三单维度,通道%的维度。猫(X = 4,伊势亚{:});%从细胞中提取标签数据和连接。Y =猫(2,YCell {:});%一个炎热的编码标签。Y, Y = onehotencode (1);结束

版本历史

介绍了R2020b