主要内容

用于深度学习的数据存储

MATLAB中的数据存储®是一种处理和表示数据集合的方便方法,这些数据集合太大,一次无法装入内存。由于深度学习通常需要大量的数据,因此数据存储是MATLAB中深度学习工作流的重要组成部分。

选择数据存储

对于许多应用程序,最简单的方法是从内置数据存储开始。有关可用内置数据存储的详细信息,请参见选择“文件格式”或“应用程序”的数据存储.但是,只有某些类型的内置数据存储可以直接用作网络训练、验证和推断的输入。这些数据存储是:

数据存储 描述 额外工具箱
ImageDatastore 图像数据的数据存储 没有一个
AugmentedImageDatastore

用于调整大小和增强训练图像的数据存储

数据存储不确定

没有一个
PixelLabelDatastore(计算机视觉工具箱)

像素标签数据的数据存储

计算机视觉工具箱

PixelLabelImageDatastore(计算机视觉工具箱)

用于训练语义分割网络的数据存储

数据存储不确定

计算机视觉工具箱

boxLabelDatastore(计算机视觉工具箱)

边界框标签数据的数据存储

计算机视觉工具箱

RandomPatchExtractionDatastore(图像处理工具箱)

用于从基于图像的数据中提取随机补丁的数据存储

数据存储不确定

图像处理工具箱™

blockedImageDatastore(图像处理工具箱) 用于逐块读取和处理图像数据的数据存储,包括不适合内存的大图像 图像处理工具箱
DenoisingImageDatastore(图像处理工具箱)

数据存储训练图像去噪深度神经网络

数据存储不确定

图像处理工具箱

其他内置数据存储可以用作深度学习的输入,但从这些数据存储中读取的数据必须预处理成深度学习网络所需的格式。有关读取数据所需格式的详细信息,请参见用于训练、验证和推断的输入数据存储.有关如何对从数据存储区读取的数据进行预处理的详细信息,请参见转换和组合数据存储

对于某些应用程序,可能没有适合您的数据的内置数据存储类型。对于这些问题,您可以创建一个自定义数据存储。有关更多信息,请参见开发自定义数据存储.所有自定义数据存储都是深度学习接口的有效输入,只要函数返回所需形式的数据。

用于训练、验证和推断的输入数据存储

数据存储是深度学习工具箱™中用于训练、验证和推断的有效输入。

培训和验证

类进行训练时,可以使用图像数据存储或其他类型的数据存储作为训练数据源trainNetwork函数。若要使用数据存储进行验证,请使用ValidationData中的名称-值对参数trainingOptions

要成为训练或验证的有效输入,函数必须以单元格数组或表的形式返回数据(除了ImageDatastore可以输出数字数组的对象和必须输出表的自定义小批量数据存储)。

对于具有单个输入的网络,数据存储返回的表或单元格数组必须有两列。第一列数据表示对网络的输入,第二列数据表示响应。每一行数据代表一个单独的观察结果。为ImageDatastore只有,trainNetwork而且trainingOptions金宝app支持数据返回为整数数组和单列单元格数组的整数数组。

要为具有多个输入层的网络使用数据存储,请使用结合而且变换函数创建输出单元格数组的数据存储(numInputs+ 1)列,其中numInputs是网络输入的数量。在这种情况下,是第一个numInputs列指定每个输入的预测器,最后一列指定响应。输入的顺序由InputNames层图的属性

方法的示例输出如下表所示用于数据存储的函数ds

网络体系结构 数据存储输出 示例输出
单输入层

有两列的表或单元格数组。

第一列和第二列分别指定预测器和响应。

表元素必须是标量、行向量或包含数字数组的1乘1单元格数组。

自定义小批量数据存储必须输出表。

一输入一输出网络表:

数据=读取(ds)
data = 4×2 table Predictors Response __________________ ________ {224×224×3 double} 2 {224×224×3 double} 7 {224×224×3 double} 9 {224×224×3 double} 9 . data = 4×2 table Predictors Response

一输入一输出网络的单元格数组:

数据=读取(ds)
Data = 4×2 cell array {224×224×3 double} {[2]} {224×224×3 double} {[7]} {224×224×3 double} {[9]} {224×224×3 double} {[9]}

多个输入层

单元格数组(numInputs+ 1)列,其中numInputs是网络输入的数量。

第一个numInputs列指定每个输入的预测器,最后一列指定响应。

输入的顺序由InputNames层图的属性

网络单元阵列,有两个输入和一个输出。

数据=读取(ds)
数据= 4×3 cell array {224×224×3 double} {128×128×3 double} {[2]} {224×224×3 double} {128×128×3 double} {[2]} {224×224×3 double} {128×128×3 double} {[9]} {224×224×3 double} {128×128×3 double} {[9]}

预测器的格式取决于数据的类型。

数据 预测词的格式
二维图像

h——- - - - - -w——- - - - - -c数字数组,其中hw,c分别是图像的高度、宽度和通道数。

三维图像

h——- - - - - -w——- - - - - -d——- - - - - -c数字数组,其中hwd,c分别是图像的高度、宽度、深度和通道数。

向量序列

c——- - - - - -年代矩阵,c序列的特征数和年代是序列长度。

一维图像序列

h——- - - - - -c——- - - - - -年代数组,h而且c分别对应于图像的高度和通道数,和年代是序列长度。

小批中的每个序列必须具有相同的序列长度。

二维图像序列

h——- - - - - -w——- - - - - -c——- - - - - -年代数组,hw,c分别对应图像的高度、宽度和通道数,和年代是序列长度。

小批中的每个序列必须具有相同的序列长度。

三维图像序列

h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -年代数组,hwd,c分别对应图像的高度、宽度、深度和通道数,和年代是序列长度。

小批中的每个序列必须具有相同的序列长度。

特性

c-by-1列向量,其中c是特征的数量。

对于表中返回的预测器,元素必须包含数字标量、数字行向量或包含数字数组的1乘1单元格数组。

trainNetwork函数不支持具有多个序列输入层的网络。金宝app

响应的格式取决于任务的类型。

任务 回应格式
分类 绝对标量
回归

  • 标量

  • 数值向量

  • 表示图像的三维数字数组

Sequence-to-sequence分类

1 -年代分类标签序列,其中年代是对应预测器序列的序列长度。

Sequence-to-sequence回归

R——- - - - - -年代矩阵,R回复的数量和年代是对应预测器序列的序列长度。

对于表中返回的响应,元素必须是分类标量、数字标量、数字行向量或包含数字数组的1乘1单元格数组。

预测

用于推理使用预测分类,激活,数据存储只需要生成与预测器对应的列。推理函数使用第一个NumInputs列并忽略后续层,其中NumInputs是网络输入层数。

指定读大小和小批大小

对于每次调用,数据存储可以返回任意数量的行(观测值).函数如trainNetwork预测分类,激活接受数据存储并支持指定金宝app“MiniBatchSize”调用尽可能多的次数,以形成完整的小批量数据。由于这些函数形成了小批,它们使用内存中的内部队列来存储读取数据。例如,如果一个数据存储每次调用始终返回64行而且MiniBatchSize128,然后形成每个小批数据需要两次调用

为了获得最佳的运行时性能,建议配置数据存储,使返回的观察数等于“MiniBatchSize”.的数据存储“ReadSize”属性,设置“ReadSize”更改每次调用时由数据存储返回的观察数

转换和组合数据存储

深度学习通常需要在数据以适当的形式输入到网络之前对数据进行预处理和扩充。的变换而且结合数据存储的功能是有用的准备数据馈送到网络。

要为具有多个输入层的网络使用数据存储,请使用结合而且变换函数创建输出单元格数组的数据存储(numInputs+ 1)列,其中numInputs是网络输入的数量。在这种情况下,是第一个numInputs列指定每个输入的预测器,最后一列指定响应。输入的顺序由InputNames层图的属性

变换数据存储

转换后的数据存储在读取数据时将特定的数据转换应用到底层数据存储。要创建转换后的数据存储,请使用变换函数并指定底层数据存储和转换。

  • 对于涉及多个预处理操作的复杂转换,请在您自己的函数中定义完整的转换集。然后,为函数指定句柄@fcn的观点变换.有关更多信息,请参见在文件中创建函数

  • 对于可以在一行代码中表示的简单转换,可以将匿名函数的句柄指定为@fcn的观点变换.有关更多信息,请参见匿名函数

提供的函数句柄变换方法返回的相同格式的输入数据底层数据存储的函数。

示例:将图像数据存储转换为训练数字分类网络

本例使用变换函数创建一个训练集,其中随机90度旋转添加到图像数据存储中的每个图像。传递结果TransformedDatastoretrainNetwork训练一个简单的数字分类网络。

创建包含数字图像的图像数据存储。

digitDatasetPath = fullfile(matlabroot,“工具箱”“nnet”...“nndemos”“nndatasets”“DigitDataset”);imds = imageDatastore(digitDatasetPath,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

将迷你批处理大小设置为ReadSize图像数据存储的。

miniBatchSize = 128;洛桑国际管理发展学院。ReadSize = miniBatchSize;

通过添加随机90度旋转来转换图像数据存储中的图像。变换函数,preprocessForTraining,在本例的末尾定义。

dsTrain = transform(imds,@preprocessForTraining,“IncludeInfo”,真正的)
dsTrain = TransformedDatastore带有属性:底层数据存储:[1×1 matlab.io.datastore.]ImageDatastore]转换:{@preprocessForTraining} IncludeInfo: 1

指定网络层和训练选项,然后使用转换后的数据存储训练网络dsTrain作为数据的来源。

图层= [imageInputLayer([28 28 1],“归一化”“没有”) reluLayer maxPooling2dLayer(2,“步”, 2) fullyConnectedLayer (10);softmaxLayer classificationLayer];选项= trainingOptions(“亚当”...“阴谋”“训练进步”...“MiniBatchSize”, miniBatchSize);net = trainNetwork(dsTrain,layers,options);

定义变换函数,preprocessForTraining.函数的输入是一组数据,数据,从底层数据存储中读取。本例中的函数循环遍历每个读取图像并执行随机旋转,然后将转换后的图像和相应的标签作为单元格数组返回trainNetwork

函数[dataOut,info] = preprocessForTraining(data,info) numRows = size(data,1);dataOut = cell(numRows,2);idx = 1:numRows%随机90度旋转imgOut = rot90(data{idx,1},randi(4)-1);返回info struct中的标签% dataOut中的第二列。dataOut(idx,:) = {imgOut,info.Label(idx)};结束结束

结合数据存储

结合函数关联多个数据存储。对结果进行操作CombinedDatastore,例如重置数据存储,将对所有底层数据存储执行相同的操作。调用函数从所有数据存储中读取一批数据N底层数据存储,必须返回相同数量的观测值。对象中读取组合数据存储时返回水平连接的结果N-列单元格数组,适用于训练和验证。打乱组合数据存储将导致底层数据存储中文件的相同随机排序。

例如,如果您正在训练一个图像到图像的回归网络,那么您可以通过组合两个图像数据存储来创建训练数据集。这个示例代码演示如何组合两个名为imdsX而且imdsY.合并的数据存储imdsTrain返回数据为两列单元格数组。

imdsX = imageDatastore(___);imdsY = imageDatastore(___);imdsTrain = combine(imdsX,imdsY)
imdsTrain =带有属性的组合数据存储:底层数据存储:{1×2 cell}

如果您有图像处理工具箱,则randomPatchExtractionDatastore(图像处理工具箱)中关联基于图像的数据的替代解决方案ImageDatastore年代,PixelLabelDatastore年代,TransformedDatastore年代。randomPatchExtractionDatastore与使用?方法关联数据相比有几个优点结合函数。具体来说,一个随机的补丁提取数据存储:

  • 提供从2-D和3-D数据中提取补丁的简单方法,而不需要使用实现自定义裁剪操作变换而且结合

  • 提供一种简单的方法来为每个小批中的每个映像生成多个补丁,而不需要使用定义自定义连接操作变换

  • 金宝app在对分类数据应用图像转换时,支持分类数据和数字数据之间的高效转换

  • 金宝app支持并行培训

  • 通过缓存映像来提高性能

使用数据存储进行并行训练和后台调度

用于并行训练或多gpu训练的数据存储必须是可分区的。要确定一个数据存储是否可分区,请使用该函数isPartitionable.属性指定并行或多gpu训练“ExecutionEnvironment”的名称-值对参数trainingOptions.并行训练或使用单个或多个gpu需要并行计算工具箱™。

许多内置数据存储已经是可分区的,因为它们支持金宝app分区函数。使用变换而且结合带有内置数据存储的函数经常维护并行和多gpu训练的支持。金宝app

如果需要创建支持并行或多gpu训练的自定义数据存储,则数据存储必须实现金宝appmatlab.io.datastore.Partitionable类。

可分区的数据存储支持使用后台调度读取训练数据。金宝appGPU工作时,后台调度在内存中队列数据。属性指定后台调度“DispatchInBackground”的名称-值对参数trainingOptions.后台调度需要并行计算工具箱。

并行训练时,数据存储不支持指定金宝app“洗牌”的名称-值对参数trainingOptions作为“没有”

另请参阅

||||

相关的例子

更多关于