minibatchqueue
为深度学习创建小批量
描述
使用一个minibatchqueue
对象创建、预处理和管理使用自定义训练循环进行训练的小批数据。
一个minibatchqueue
对象遍历数据存储,以使用自定义训练循环以适合训练的格式提供数据。对象准备一个按需预处理的小批队列。使用一个minibatchqueue
对象,以自动将数据转换为dlarray
或gpuArray
,将数据转换为不同的精度,或应用自定义函数对数据进行预处理。您可以在后台并行地准备数据。
在培训期间,您可以使用minibatchqueue
对象。方法可以在每个训练历的开始打乱数据洗牌
方法从队列中收集每次训练迭代的数据下一个
函数。方法检查队列中是否有任何数据hasdata
功能,重置
当队列为空时。
创建
描述
创建一个兆贝可
= minibatchqueue (ds
,numOutputs
)minibatchqueue
对象从输入数据存储区获取ds
并设置每个小批中的变量数量。使用时使用此语法MiniBatchFcn
指定一个小批预处理函数,该函数的输出数量与输入数据存储的变量数量不同ds
.
使用名称-值选项设置一个或多个属性。例如,兆贝可
= minibatchqueue (___、名称、值)minibatchqueue (ds,“MiniBatchSize ", 64年,“PartialMiniBatches”、“丢弃”)
将返回的小批量的大小设置为64,并丢弃观测值小于64的任何小批量。
输入参数
ds
- - - - - -输入数据存储
数据存储|自定义数据存储
输入数据存储,指定为MATLAB®数据存储或自定义数据存储。
有关用于深度学习的数据存储的更多信息,请参见用于深度学习的数据存储.
numOutputs
- - - - - -小批处理变量的数量
正整数
小批处理变量的个数,指定为正整数。默认情况下,小批处理变量的数量等于输入数据存储的变量的数量。
的输出可以确定输入数据存储的变量的数量阅读(ds)
.如果数据存储返回一个表,那么变量的数量就是表的变量的数量。如果数据存储返回单元格数组,则变量的数量为单元格数组的第二个维度的大小。
如果您使用MiniBatchFcn
参数要指定返回与输入数据存储不同数量的变量的小批预处理函数,则必须设置numOutputs
匹配函数的输出数量。
例子:2
属性
MiniBatchSize
- - - - - -mini-batches大小
128
(默认)|正整数
PartialMiniBatch
- - - - - -退回或丢弃不完整的小批次
“回归”
(默认)|“丢弃”
返回或丢弃未完成的小批次,指定为“回归”
或“丢弃”
.
如果观察的总数不能被整除MiniBatchSize
返回的最后一个小批下一个
函数可以小于MiniBatchSize
观察。此属性指定如何使用以下选项处理任何部分迷你批:
“回归”
—小批量可以包含少于MiniBatchSize
观察。返回所有数据。“丢弃”
-所有小批量必须包含MiniBatchSize
观察。如果没有足够的数据来完成一个完整的小批处理,则可以从队列中丢弃一些数据。
集PartialMiniBatch
来“丢弃”
如果你要求所有的小批次都是相同的尺寸。
例子:“丢弃”
数据类型:字符
|字符串
MiniBatchFcn
- - - - - -Mini-batch预处理功能
“整理”
(默认)|函数处理
此属性是只读的。
小批量预处理功能,指定为“整理”
或者一个函数句柄。
的默认值。MiniBatchFcn
是“整理”
.这个函数将小批处理变量连接到数组中。
使用自定义函数的函数句柄对小批量进行预处理,以进行自定义培训。对于一次性编码分类标签、填充序列数据、计算平均图像等,建议这样做。如果数据由包含不同大小数组的单元格数组组成,则必须指定自定义函数。
如果指定自定义小批预处理函数,则该函数在预处理后必须将每批输出变量连接到一个数组中,并将每个变量作为单独的函数输出返回。函数必须接受至少与基础数据存储的变量数量相同的输入。输入被传递给自定义函数为N-by-1单元格数组,其中N是小批中的观察数。函数可以根据需要返回任意数量的变量。如果函数指定MiniBatchFcn
返回与输入不同的输出数量,指定numOutputs
作为函数输出的个数。
在自定义函数中不建议执行以下操作。对象时,要重新生成所需的行为,请设置相应的属性minibatchqueue
对象。
行动 | 推荐的属性 |
---|---|
将变量转换为不同的数据类型。 | OutputCast |
将数据移动到GPU。 | OutputEnvironment |
将数据转换成dlarray . |
OutputAsDlarray |
将数据格式应用于dlarray 变量。 |
MiniBatchFormat |
例子:@myCustomFunction
数据类型:字符
|字符串
|function_handle
DispatchInBackground
- - - - - -在并行池的后台对小批量进行预处理
假
或0
(默认)|真正的
或1
在并行池的后台对小批进行预处理,指定为数字或逻辑1
(真正的
)或0
(假
).
使用此选项需要并行计算工具箱™。输入数据存储ds
必须是可细分或可分区的。要使用此选项,自定义数据存储应实现matlab.io.datastore.Subsettable
类。
当您的小批次需要大量预处理时,请使用此选项。该选项使用并行池在后台准备小批,同时在培训期间使用小批。
中的工作人员通过应用指定的函数来处理小批量MiniBatchFcn
.进一步处理,包括应用效果OutputCast
,OutputEnvironment
,OutputAsDlarray
,MiniBatchFormat
,不会发生在工人身上。
当DispatchInBackground
被设置为真正的
,该软件使用当前设置打开一个本地并行池,如果本地池当前没有打开。不支持非本地池。你第一次打电话,泳池就会打开下一个
.
例子:真正的
数据类型:逻辑
OutputCast
- - - - - -每个小批变量的数据类型
“单一”
(默认)|“双”
|“int8”
|“int16”
|“int32”
|“int64”
|“uint8”
|“uint16”
|“uint32”
|“uint64”
|“逻辑”
|“字符”
|单元阵列
此属性是只读的。
每个小批处理变量的数据类型,指定为“单一”
,“双”
,“int8”
,“int16”
,“int32”
,“int64”
,“uint8”
,“uint16”
,“uint32”
,“uint64”
,“逻辑”
,或“字符”
,或这些值的单元格数组,或空向量。
如果您指定OutputCast
作为空向量,每个小批处理变量的数据类型不变。要为每个小批处理变量指定不同的数据类型,请为每个小批处理变量指定包含条目的单元格数组。此单元格数组元素的顺序必须与返回小批处理变量的顺序匹配。函数指定的函数返回变量的顺序与此顺序相同MiniBatchFcn
.如果未指定自定义函数MiniBatchFcn
,它与底层数据存储返回变量的顺序相同。
你必须确保的价值OutputCast
是否与价值观相冲突OutputAsDlarray
或OutputEnvironment
属性。如果您指定OutputAsDlarray
作为真正的
或1
,检查指定的数据类型OutputCast
支持dlarray
.如果您指定OutputEnvironment
作为“图形”
或“汽车”
和支持的GPU可用,检查指定的数据类型OutputCast
支持gpuArray
(并行计算工具箱).
例子:{‘单身’,‘单身’,‘逻辑’}
数据类型:字符
|字符串
OutputAsDlarray
- - - - - -标志,将小批处理变量转换为dlarray
真正的
或1
(默认)|假
或0
|逻辑值向量
此属性是只读的。
标志,将小批处理变量转换为dlarray
,指定为数字或逻辑1
(真正的
)或0
(假
)或作为数字或逻辑值的向量。
要为每个输出指定不同的值,请为每个小批处理变量指定一个包含条目的向量。此向量的元素顺序必须与返回小批处理变量的顺序匹配。函数指定的函数返回变量的顺序与此顺序相同MiniBatchFcn
.如果未指定自定义函数MiniBatchFcn
,它与底层数据存储返回变量的顺序相同。
被转换为的变量dlarray
对象指定的基础数据类型是否为OutputCast
财产。
例子:(1 1 0)
数据类型:逻辑
MiniBatchFormat
- - - - - -小批处理变量的数据格式
''
(默认)|特征向量|单元阵列
此属性是只读的。
小批处理变量的数据格式,指定为字符向量或字符向量的单元格数组。
应用小批处理格式dlarray
变量。非dlarray
小批处理变量必须具有MiniBatchFormat
的''
.
以避免出现错误dlarray
和非dlarray
变量时,必须为每个输出指定一个值,方法是为每个小批处理变量提供一个包含条目的单元格数组。此单元格数组元素的顺序必须与返回小批处理变量的顺序匹配。所指定的函数返回变量的顺序与此相同MiniBatchFcn
.如果未指定自定义函数MiniBatchFcn
,它与底层数据存储返回变量的顺序相同。
例子:{‘SSCB’,”}
数据类型:字符
|字符串
OutputEnvironment
- - - - - -用于小型批处理变量的硬件资源
“汽车”
(默认)|“图形”
|“cpu”
|单元阵列
方法返回的小批处理变量的硬件资源下一个
函数,指定为以下值之一:
“汽车”
—如果GPU上有小批量变量,返回小批量变量。否则,返回CPU上的小批处理变量。“图形”
—在GPU上返回小批量变量。“cpu”
—返回CPU上的小批量变量
若要仅返回GPU上的特定变量,请指定OutputEnvironment
作为单元格数组,包含每个小批处理变量的条目。此单元格数组元素的顺序必须与返回小批处理变量的顺序匹配。的函数返回变量的顺序与此顺序相同MiniBatchFcn
.如果不指定自定义MiniBatchFcn
,它与底层数据存储返回变量的顺序相同。
使用GPU需要“并行计算工具箱”。要使用GPU进行深度学习,还必须有支持的GPU设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱).如果您选择“图形”
选项和并行计算工具箱或合适的GPU不可用,则软件返回错误。
例子:{gpu, cpu的}
数据类型:字符
|字符串
对象的功能
例子
为自定义训练循环准备小批量
使用一个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”,''},...“OutputEnvironment”, {“图形”,“cpu”})
使用下一个
获取小批量的函数兆贝可
.
(X, Y) =下一个(兆贝可);
使用自定义预处理功能和后台调度创建小批量
对数据进行预处理minibatchqueue
具有自定义的小批量预处理功能。自定义函数在0到1之间缩放传入的图像数据,并计算平均图像。
解压缩数据并创建一个数据存储。
解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”,...IncludeSubfolders = true,...LabelSource =“foldernames”);
创建一个minibatchqueue。
设置输出的数量为
2
,以匹配函数的输出数。设置小批量大小。
使用自定义函数对数据进行预处理
preprocessMiniBatch
在本例的最后定义。自定义函数将图像数据连接到一个数值数组中,在0到1之间缩放图像,并计算这批图像的平均值。函数返回缩放后的图像批次和平均图像。通过设置并行池在后台应用预处理功能
DispatchInBackground
财产真正的
.设置DispatchInBackground
来真正的
需要并行计算工具箱™。不要将小批处理输出变量转换为
dlarray
.
兆贝可= minibatchqueue (imd 2...MiniBatchSize = 16,...MiniBatchFcn = @preprocessMiniBatch,...DispatchInBackground = true,...OutputAsDlarray = false)
mbq =带有2个输出和属性的minibatchqueue:迷你批处理创建:MiniBatchSize: 16 PartialMiniBatch: 'return' MiniBatchFcn: @preprocessMiniBatch DispatchInBackground: 1 outputs: OutputCast: {'single' 'single'} OutputAsDlarray: [0 0] MiniBatchFormat: {'' ''} OutputEnvironment: {'auto' 'auto'}
如果你正在使用DispatchInBackground
如果一个并行池还没有打开,那么当从小批处理队列读取数据时,一个本地并行池将自动打开。如果基于线程的环境支持预处理功能,请打开基于线程的并行池,以减少内存使用、更快的调度和更低的数据传输成本。有关更多信息,请参见在基于线程和基于进程的环境之间进行选择(并行计算工具箱).
parpool (“线程”);
使用“Threads”配置文件启动并行池(parpool)…连接到并行池(工人数量:4)。
获取一个小批,并显示小批中图像的平均值。线程工作者应用预处理函数。
[X, averageImage] =下一个(兆贝可);imshow (averageImage)
函数[X,averageImage] = preprocessMiniBatch(XCell) X = cat(4,XCell{:});X =重新调节(X, InputMin = 0, InputMax = 255);averageImage =意味着(X, 4);结束
使用minibatchqueue
自定义训练循环
训练网络使用minibatchqueue
管理小批量的加工。
负荷训练数据
加载数字训练数据,并将数据存储在数据存储中。为图像创建一个数据存储,为使用的标签创建一个数据存储arrayDatastore
.然后,将这些数据存储组合在一起,生成要使用的单个数据存储minibatchqueue
.
[XTrain, YTrain] = digitTrain4DArrayData;dsX = arrayDatastore (XTrain IterationDimension = 4);dsY = arrayDatastore (YTrain);dsTrain =结合(dsX dsY);
确定标签数据中唯一类的数量。
类=类别(YTrain);numClasses =元素个数(类);
定义网络
方法定义网络并指定平均图像值的意思是
选项在图像输入层。
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
对象从图层图。
网= dlnetwork (lgraph);
定义模型损失函数
创建helper函数modelLoss
,列在示例的末尾。函数接受输入adlnetwork
对象网
以及一小批输入数据X
与相应的标签Y
,并返回损失和损失相对于可学习参数的梯度网
.
指定培训选项
指定要在培训期间使用的选项。
numEpochs = 10;miniBatchSize = 128;
把训练的过程想象成一个图形。
情节=“训练进步”;
创建minibatchqueue
使用minibatchqueue
处理和管理小批量的图像。为每个mini-batch:
丢弃部分mini-batches。
使用自定义的小批量预处理功能
preprocessMiniBatch
(在本例末尾定义)对类标签进行一次性编码。用尺寸标签格式化图像数据
“SSCB”
(空间,空间,渠道,批处理)。默认情况下,minibatchqueue
对象将数据转换为dlarray
具有基础数据类型的对象单
.不要向类标签添加格式。如果有GPU,请使用GPU进行训练。默认情况下,
minibatchqueue
对象将每个输出转换为gpuArray
如果有可用的GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱).
兆贝可= minibatchqueue (dsTrain,...MiniBatchSize = MiniBatchSize,...PartialMiniBatch =“丢弃”,...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat = [“SSCB”,""]);
列车网络的
使用自定义训练循环训练模型。中的数据仍然可用时,洗牌数据并遍历小批minibatchqueue
.更新网络参数adamupdate
函数。在每个阶段结束时,显示训练进度。
初始化平均梯度和平均梯度的平方。
averageGrad = [];averageSqGrad = [];
计算训练进度监视器的总迭代次数。
numObservationsTrain =元素个数(YTrain);numIterationsPerEpoch = ceil(numObservationsTrain / miniBatchSize);numIterations = numEpochs * numIterationsPerEpoch;
初始化TrainingProgressMonitor
对象。因为计时器在创建监视器对象时开始,所以要确保创建的对象接近训练循环。
如果情节= =“训练进步”监控= = trainingProgressMonitor(指标“损失”信息=“时代”包含=“迭代”);结束
培训网络。
迭代= 0;时代= 0;而epoch < numEpochs && ~monitor。停止epoch = epoch + 1;%洗牌数据。洗牌(兆贝可);而hasdata(兆贝可)& & ~班长。停止迭代=迭代+ 1;读取小批数据。(X, Y) =下一个(兆贝可);使用dlfeval和modelLoss帮助函数。(损失、研究生)= dlfeval (@modelLoss净,X, Y);使用Adam优化器更新网络参数。[净,averageGrad averageSqGrad] = adamupdate(网络,毕业生,averageGrad averageSqGrad,迭代);更新培训进度监视器。如果情节= =“训练进步”recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=时代+“的”+ numEpochs);班长。进度= 100 *迭代/numIterations;结束结束结束
损失函数模型
的modelLoss
Helper函数接受输入adlnetwork
对象网
以及一小批输入数据X
与相应的标签Y
,并返回损失和损失相对于可学习参数的梯度网
.方法可自动计算梯度dlgradient
函数。
函数[loss,gradient] = modelLoss(net,X,Y) YPred = forward(net,X);损失= crossentropy (YPred Y);梯度= dlgradient(损失、net.Learnables);结束
Mini-Batch预处理功能
的preprocessMiniBatch
函数使用以下步骤对数据进行预处理:
从传入的单元格数组中提取图像数据,并将数据连接到数值数组中。将第四个维度上的图像数据连接起来,将为每个图像添加第三个维度,用作单例通道维度。
从传入单元格数组中提取标签数据,并沿着第二次元连接到分类数组中。
一热编码类别标签到数字数组。对第一个维度进行编码会生成一个与网络输出形状匹配的编码数组。
函数(X, Y) = preprocessMiniBatch(伊势亚YCell)从单元格阵列中提取图像数据并连接四分之一以上。%维度来添加第三个单例维度,作为通道%的维度。猫(X = 4,伊势亚{:});从单元格中提取标签数据并连接。Y =猫(2,YCell {:});单热编码标签。Y, Y = onehotencode (1);结束
版本历史
介绍了R2020b
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。