主要内容

用于深度学习的数据存储

在MATLAB数据存储®是一种方便的方法,用于处理和表示太大而不能一次放入内存的数据集合。由于深度学习往往需要大量的数据,数据存储是MATLAB中深度学习工作流的重要组成部分。

选择数据存储

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

数据存储 描述 需要其他工具箱
ImageDatastore 用于图像数据的数据存储 没有任何
AugmentedImageDatastore

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

数据存储是非确定性的

没有任何
PixelLabelDatastore(计算机视觉工具箱)

用于像素标签数据的数据存储

计算机视觉工具箱™

PixelLabelImageDatastore(计算机视觉工具箱)

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

数据存储是非确定性的

计算机视觉的工具箱

boxLabelDatastore(计算机视觉工具箱)

用于边界框标记数据的数据存储

计算机视觉的工具箱

RandomPatchExtractionDatastore(图像处理工具箱)

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

数据存储是非确定性的

图像处理工具箱™

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

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

数据存储是非确定性的

图像处理工具箱

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

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

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

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

培训和验证

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

为成为培训或验证的有效输入数据存储的函数必须以单元格数组或表的形式返回数据(除了ImageDatastore可以输出必须输出表的数字阵列和自定义迷你批处理数据存储的对象)。

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

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

的调用的示例输出如下所示函数数据存储ds

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

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

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

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

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

一输入一输出网络表:

数据=读(DS)
数据= 4×2表预测响应__________________ ________ {224×224×3 double} 2 {224×224×3双} 7 {224×224×3双} 9 {224×224×3双} 9

一个输入一个输出的网络单元阵列:

数据=读(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)
Data = 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]}

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

数据 格式的预测
2-D图像

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

3-D图像

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

向量序列

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

一维图像序列

h——- - - - - -c——- - - - - -年代阵列,其中hc分别对应图像的通道高度和通道数量,和年代为序列长度。

mini-batch中的每个序列必须具有相同的序列长度。

2-D图像序列

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

mini-batch中的每个序列必须具有相同的序列长度。

三维图像序列

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

mini-batch中的每个序列必须具有相同的序列长度。

特征

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

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

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

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

任务 回应的格式
分类 分类标量
回归

  • 标量

  • 数值向量

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

Sequence-to-sequence分类

1 -年代分类标签的序列,在哪里年代是相应的预测序列的序列长度。

Sequence-to-sequence回归

R——- - - - - -年代矩阵,R是多少回应和年代是相应的预测序列的序列长度。

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

预测

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

指定读取大小和迷你批处理大小

数据存储可以为每次调用返回任意数量的行(观察值).等功能trainNetwork预测分类,激活接受数据存储和支持指定a金宝app'迷你atchsize'称呼需要多少次才能形成完整的小批量数据。由于这些函数形成了迷你批,它们使用内存中的内部队列来存储读数据。例如,如果数据存储每次调用都返回64行MiniBatchSize128.,然后形成每个迷你批次数据需要两个呼叫

为了获得最佳运行时性能,建议将数据存储配置为等于'迷你atchsize'.的数据存储“ReadSize”财产,设置“ReadSize”要更改数据存储返回的观察次数,每个呼叫

转换和组合数据存储

深度学习经常需要将数据预处理和增强在数据以适当的表单中输入到网络之前。的变换结合数据存储的功能在准备将数据送入网络时很有用。

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

转换数据存储

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

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

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

提供的函数句柄变换必须接受与底层数据存储的功能。

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

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

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

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

将迷你批处理大小设置为阅读映像数据存储的。

minibatchsize = 128;IMDS.Readsize =小匹匹配;

通过添加随机的90度旋转来变换图像数据存储中的图像。转换函数,预处理性景观,在本例的最后定义。

dstrain =变换(IMDS,@预处理景观,“IncludeInfo”,真正的)
[1×1 matlab.io.datastore. dsTrain = TransformedDatastore . properties:ImageDatastore转换:{@preprocessForTraining} IncludeInfo

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

[imageInputLayer([28 28 1],]),'正常化'“没有”reluLayer maxPooling2dLayer(2, 10)“步”, 2) fullyConnectedLayer (10);softmaxLayer classificationLayer];选择= trainingOptions ('亚当'......“阴谋”'培训 - 进步'......'迷你atchsize', miniBatchSize);网= trainNetwork (dsTrain层,选项);

定义转换功能,预处理性景观.函数的输入是一批数据,数据,从底层数据存储读取。本例中的函数遍历每个读图像并执行随机旋转,然后按照预期的方式将转换后的图像和相应的标签作为单元格数组返回trainNetwork

函数[dataOut,info] = preprocessForTraining(data,info) numRows = size(data,1);dataOut =细胞(numRows, 2);idx = 1: numRows%随机90度旋转imgout = rot90(数据{idx,1},randi(4)-1);从info结构体返回标签作为% dataOut中的第二列。dataout(IDX,:) = {Imgout,Info.Label(IDX)};结束结束

结合数据存储

结合函数关联多个数据存储。对结果进行操作ConventDatastore.,例如重新设置数据存储,则对所有底层数据存储执行相同的操作。调用组合数据存储的函数从所有的N底层数据存储,必须返回相同数量的观察值。从组合数据存储中读取将在N-列单元格数组,适合于培训和验证。混合数据存储将导致底层数据存储中文件的相同随机排序。

例如,如果您正在训练图像到图像回归网络,则可以通过组合两个图像数据存储来创建培训数据集。此示例代码演示了组合名为的两个图像数据存储imdsXimdsY.组合数据存储imdsTrain将数据返回为双列单元格数组。

imdsX = imageDatastore (___);imdsY = imageDatastore (___);imdsTrain =结合(imdsX imdsY)
IMDStrain =具有属性的组合日常运输:底层attaketores:{1×2 Cell}

如果您有图像处理工具箱,那么RandompatchExtractionDataStore.(图像处理工具箱)提供备用解决方案,以将基于图像的数据相关联ImageDatastoreS,PixelLabelDatastore年代,TransformedDatastores。一种RandompatchExtractionDataStore.与使用结合功能。具体来说,随机补丁提取数据存储:

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

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

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

  • 金宝app支持并行训练

  • 通过缓存映像提高性能

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

用于并行训练或多gpu训练的数据存储必须是可分区的。要确定数据存储是否可分区,请使用该函数是artitionable..指定并行或多gpu训练使用ExecutionEnvironment的名称-值对参数trainingOptions.并行或使用单个或多个gpu的培训需要parallel Computing Toolbox™。

许多内置数据存储已经是可分区的,因为它们支持金宝app划分功能。使用变换结合内置数据存储的功能经常维护对并行和多GPU培训的支持。金宝app

如果您需要创建支持并行或多GPU培训的自定义数据存储,那么您的数据存储必须实现金宝appmatlab.io.datastore.partitionable.班级。

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

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

另请参阅

||||

相关的例子

更多关于