在MATLAB数据存储®是一种方便的方法,用于处理和表示太大而不能一次放入内存的数据集合。由于深度学习往往需要大量的数据,数据存储是MATLAB中深度学习工作流的重要组成部分。
对于许多应用程序,最简单的方法是从内置数据存储开始。有关可用内置数据存储的更多信息,请参阅为文件格式或应用程序选择数据存储。但是,只有某些类型的内置数据存储可直接用作网络培训、验证和推断的输入。这些数据存储包括:
数据存储 | 描述 | 需要额外的工具箱 |
---|---|---|
ImageDatastore |
用于图像数据的数据存储 | 没有一个 |
AugmentedImageDatastore |
用于调整和增强训练图像的数据存储 数据存储是不确定的 |
没有一个 |
PixelLabelDatastore (计算机视觉工具箱) |
用于像素标签数据的数据存储 |
计算机视觉工具箱™ |
PixelLabelImageDatastore (计算机视觉工具箱) |
用于训练语义分割网络的数据存储 数据存储是不确定的 |
计算机视觉的工具箱 |
boxLabelDatastore (计算机视觉工具箱) |
边界框标签数据的数据存储 |
计算机视觉的工具箱 |
RandomPatchExtractionDatastore (图像处理工具箱) |
用于从基于图像的数据中提取随机补丁的数据存储 数据存储是不确定的 |
图像处理工具箱™ |
分块图像数据存储 (图像处理工具箱) |
用于块读取和处理图像数据的数据存储设备,包括内存中不合适的大图像 | 图像处理工具箱 |
DenoisingImageDatastore (图像处理工具箱) |
数据存储来训练图像去噪深度神经网络 数据存储是不确定的 |
图像处理工具箱 |
其他内置数据存储可以作为深度学习的输入,但从这些数据存储读取的数据必须预处理成深度学习网络所需的格式。有关读数据所需格式的详细信息,请参见用于训练、验证和推理的输入数据存储.有关如何预处理从数据存储读取的数据的详细信息,请参见转换和合并数据存储.
对于某些应用程序,可能没有适合您的数据的内置数据存储类型。对于这些问题,您可以创建自定义数据存储。有关详细信息,请参阅开发自定义数据存储.所有自定义数据存储都是深度学习接口的有效输入,只要读
函数的自定义数据存储返回所需表单中的数据。
数据存储是深度学习工具箱™中用于训练、验证和推断的有效输入。
属性进行训练时,可以使用图像数据存储或其他类型的数据存储作为训练数据的来源trainNetwork
要使用数据存储进行验证,请使用'
中的名称-值对参数ValidationData
'trainingOptions
.
为成为培训或验证的有效输入读
数据存储的函数必须以单元格数组或表的形式返回数据(除了ImageDatastore
可以输出数字数组的对象和必须输出表的自定义小批量数据存储)。
对于只有一个输入的网络,数据存储返回的表或单元格数组必须有两列。第一列数据表示对网络的输入,第二列数据表示响应。每一行数据代表一个单独的观察。为ImageDatastore
只有,trainNetwork
和trainingOptions
金宝app支持数据返回为整数数组和整数数组的单列单元格数组。
要为具有多个输入层的网络使用数据存储,请使用结合
和变换
函数创建数据存储,该数据存储输出具有(numInputs
+1)列,其中numInputs
是网络输入的数量。在本例中,第一个numInputs
列指定每个输入的预测器,最后一列指定响应。输入的顺序由InputNames
层图的性质层
.
的调用的示例输出如下所示读
函数数据存储ds
.
网络体系结构 | 数据存储输出 | 示例输出 |
---|---|---|
单个输入层 | 具有两列的表或单元格数组。 第一列和第二列分别指定预测值和响应。 表元素必须是标量、行向量或包含数字数组的1 × 1单元格数组。 自定义小批量数据存储必须输出表。 |
一输入一输出网络表: 数据=读取(ds) 数据=4×2表预测值响应{224×224×3双}2{224×224×3双}7{224×224×3双}9{224×224×3双} |
一个输入一个输出的网络单元阵列: 数据=读取(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]} |
||
多个输入层 | 单元阵列( 第一 输入的顺序由 |
单元阵列用于具有两个输入和一个输出的网络。 数据=读取(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]} |
预测值的格式取决于数据的类型。
数据 | 格式的预测 |
---|---|
二维图像 | h-借-w-借-c数字数组,其中h,w,c分别为图像的高度、宽度和通道数量。 |
三维图像 | h-借-w-借-d-借-c数字数组,其中h,w,d,c分别是图像的高度、宽度、深度和通道数。 |
向量序列 | c-借-年代矩阵,在哪里c数列的特征数是和吗年代为序列长度。 |
一维图像序列 | h-借-c-借-年代数组,在哪里h和c分别对应图像的通道高度和通道数量,和年代为序列长度。 mini-batch中的每个序列必须具有相同的序列长度。 |
二维图像序列 | h-借-w-借-c-借-年代数组,在哪里h,w,c分别对应图像的高度、宽度和通道数量,和年代为序列长度。 mini-batch中的每个序列必须具有相同的序列长度。 |
三维图像序列 | h-借-w-借-d-借-c-借-年代数组,在哪里h,w,d,c分别对应图像的高度、宽度、深度和通道数量,和年代为序列长度。 mini-batch中的每个序列必须具有相同的序列长度。 |
特征 | c-by-1列向量,其中c是功能的数量。 |
对于表中返回的预测器,元素必须包含数字标量、数字行向量或包含数字数组的1 × 1单元格数组。
的trainNetwork
函数不支持具有多个序列输入层的网络。金宝app
响应的格式取决于任务的类型。
任务 | 答复的格式 |
---|---|
分类 | 范畴标量 |
回归 |
|
Sequence-to-sequence分类 | 1 -年代分类标签序列,其中年代是对应预测器序列的序列长度。 |
Sequence-to-sequence回归 | R-借-年代矩阵,在哪里R是多少回应和年代是对应预测器序列的序列长度。 |
对于表中返回的响应,元素必须是分类标量、数字标量、数字行向量或包含数字数组的1×1单元格数组。
推理用预测
,分类
,激活
,数据存储只需要生成与预测器对应的列。推理函数使用第一个努明普茨
列并忽略后面的层,其中努明普茨
是网络输入层的数量。
数据存储可以为每次调用返回任意数量的行(观察值)读
.等功能trainNetwork
,预测
,分类
,激活
接受数据存储并支持指定金宝app“MiniBatchSize”
呼叫读
需要多少次才能形成完整的小批量数据。由于这些函数形成了迷你批,它们使用内存中的内部队列来存储读数据。例如,如果数据存储每次调用都返回64行读
和MiniBatchSize
是128
,则要形成每个小数据批,需要对读
.
为了获得最佳运行时性能,建议将数据存储配置为读
等于“MiniBatchSize”
.的数据存储“ReadSize”
属性,设置“ReadSize”
更改数据存储为每次调用返回的观察数读
.
深度学习通常需要先对数据进行预处理和扩充,然后才能将数据以适当的形式输入网络变换
和结合
数据存储的功能在准备将数据送入网络时很有用。
要为具有多个输入层的网络使用数据存储,请使用结合
和变换
函数创建数据存储,该数据存储输出具有(numInputs
+1)列,其中numInputs
是网络输入的数量。在本例中,第一个numInputs
列指定每个输入的预测器,最后一列指定响应。输入的顺序由InputNames
层图的性质层
.
转换后的数据存储在读取数据时对基础数据存储应用特定的数据转换变换
函数,并指定底层数据存储和转换。
提供给的函数句柄变换
必须接受与读
底层数据存储的功能。
示例:将图像数据存储转换为训练数字分类网络
本示例使用变换
函数创建训练集,其中随机90度旋转添加到图像数据存储中的每个图像。通过结果TransformedDatastore
到trainNetwork
训练一个简单的数字分类网络。
创建包含数字图像的图像数据存储。
digitDatasetPath=fullfile(matlabroot,“工具箱”,“内特”,...“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (digitDatasetPath,...“IncludeSubfolders”符合事实的...“LabelSource”,“foldernames”);
将迷你批处理大小设置为可读大小
映像数据存储的。
miniBatchSize=128;imds.ReadSize=miniBatchSize;
通过添加随机的90度旋转来变换图像数据存储中的图像。转换函数,预训练
,在本例的最后定义。
dsTrain=变换(imds,@prepreprefortrain,“IncludeInfo”,真正的)
[1×1 matlab.io.datastore. dsTrain = TransformedDatastore . properties:ImageDatastore转换:{@preprocessForTraining} IncludeInfo
指定网络层和训练选项,然后使用转换后的数据存储训练网络dsTrain
作为数据的来源。
层=[imageInputLayer([28 1],“正常化”,“没有”reluLayer maxPooling2dLayer(2, 10)“步”,2)全连接层(10);softmaxLayer分类层];选项=培训选项(“亚当”,...“阴谋”,“培训进度”,...“MiniBatchSize”, miniBatchSize);网= trainNetwork (dsTrain层,选项);
定义转换函数,预训练
.函数的输入是一批数据,数据
,从底层数据存储读取。本例中的函数遍历每个读图像并执行随机旋转,然后按照预期的方式将转换后的图像和相应的标签作为单元格数组返回trainNetwork
.
函数[dataOut,info]=prepreprefortraining(data,info)numRows=size(data,1);dataOut=cell(numRows,2);为idx = 1: numRows%随机90度旋转imgOut=rot90(数据{idx,1},randi(4)-1);从info结构体返回标签作为%数据输出中的第二列。dataOut(idx,:)={imgOut,info.Label(idx)};结束结束
的结合
函数关联多个数据存储。对结果进行操作组合数据存储
,例如重置数据存储,在所有基础数据存储上执行相同的操作读
组合数据存储的函数从所有数据库中读取一批数据N底层数据存储,必须返回相同数量的观察值。从组合数据存储中读取将在N-适合于培训和验证的列单元阵列。洗牌组合数据存储将导致底层数据存储中的文件具有相同的随机顺序。
例如,如果您正在训练一个图像到图像的回归网络,那么您可以通过组合两个图像数据存储来创建训练数据集imdsX
和imdsY
.组合数据存储imdsTrain
以两列单元格数组的形式返回数据。
imdsX = imageDatastore (___);imdsY = imageDatastore (___);imdsTrain =结合(imdsX imdsY)
imdsTrain=CombinedDatastore与属性:底层数据存储:{1×2 cell}
如果您有图像处理工具箱,则随机抽取数据存储
(图像处理工具箱)提供了另一种将基于图像的数据关联到中的解决方案ImageDatastore
sPixelLabelDatastore
年代,TransformedDatastore
s、 A随机抽取数据存储
与使用结合
功能。具体而言,随机补丁提取数据存储:
提供了一种简单的方法来从2-D和3-D数据提取补丁,而不需要您实现自定义裁剪操作变换
和结合
提供一种简单的方法来为每个小批处理的每个图像生成多个补丁,而不需要使用定义自定义连接操作变换
.
金宝app当应用图像转换到分类数据时,支持分类数据和数字数据之间的有效转换
金宝app支持并行训练
通过缓存映像提高性能
用于并行训练或多gpu训练的数据存储必须是可分区的。要确定数据存储是否可分区,请使用该函数可分割
.指定并行或多gpu训练使用'
的名称-值对参数执行环境
'trainingOptions
. 并行培训或使用单个或多个GPU需要并行计算工具箱™.
许多内置数据存储已经是可分区的,因为它们支持金宝app隔断
函数。使用变换
和结合
具有内置数据存储的函数经常维护对并行和多GPU训练的支持。金宝app
如果您需要创建支持并行或多GPU训练的自定义数据存储,那么您的数据存储必须实现金宝appmatlab.io.datastore.Partitionable
班
可分区数据存储支持使用后台调度读取训练数据。金宝appGPU工作时,后台调度队列数据在内存中。属性指定后台调度'
的名称-值对参数派遣背景
'trainingOptions
.后台调度需要并行计算工具箱。
并行训练时,数据存储不支持指定金宝app'
的名称-值对参数洗牌
'trainingOptions
作为“没有”
.
变换
|结合
|trainNetwork
|trainingOptions
|读