开发自定义小批量数据存储
一个mini-batch数据存储是支持批量读取数据的数据存储的实现。金宝app您可以使用小批数据存储作为使用deep learning Toolbox™的深度学习应用程序的训练、验证、测试和预测数据集的来源。
若要预处理序列、时间序列或文本数据,请使用本文描述的框架构建自己的迷你批处理数据存储。有关显示如何使用自定义小批数据存储的示例,请参见训练网络使用自定义小批量数据存储序列数据.
概述
使用自定义数据存储类和对象构建自定义数据存储接口。然后,使用自定义数据存储将数据带入MATLAB®.
设计自定义小批数据存储涉及从matlab.io.Datastore
而且matlab.io.datastore.MiniBatchable
类,并实现所需的属性和方法。您可以选择在训练期间添加对洗牌的支持。金宝app
处理需求 |
类 |
---|---|
用于深度学习工具箱中的训练、验证、测试和预测数据集的小批量数据存储 |
看到实现迷你批处理数据存储. |
支持训练期间变换的迷你批数据存储金宝app |
|
实现MiniBatchable
数据存储
实现一个名为MyDatastore
,创建一个脚本MyDatastore.m
.脚本必须在MATLAB路径上,并且应该包含从适当的类继承并定义所需方法的代码。在深度学习工具箱中为训练、验证、测试和预测数据集创建小批量数据存储的代码必须:
定义这些属性:
MiniBatchSize
而且NumObservations
.
除了这些步骤之外,您还可以定义处理和分析数据所需的任何其他属性或方法。
请注意
如果你在训练一个网络trainingOptions
指定“洗牌”
作为“一次”
或“every-epoch”
,那么你也必须继承从matlab.io.datastore.Shuffleable
类。有关更多信息,请参见增加对变金宝app换的支持.
数据存储读函数必须返回表中的数据。表元素必须是标量、行向量或包含数字数组的1乘1单元格数组。
对于具有单一输入层的网络,第一列和第二列分别指定预测器和响应。
提示
要为具有多个输入层的网络使用数据存储,请使用结合
而且变换
函数创建输出单元格数组的数据存储(numInputs
+ 1)列,其中numInputs
是网络输入的数量。在这种情况下,是第一个numInputs
列指定每个输入的预测器,最后一列指定响应。输入的顺序由InputNames
层图的属性层
.
预测器的格式取决于数据的类型。
数据 | 预测词的格式 |
---|---|
二维图像 | h——- - - - - -w——- - - - - -c数字数组,其中h,w,c分别是图像的高度、宽度和通道数。 |
三维图像 | h——- - - - - -w——- - - - - -d——- - - - - -c数字数组,其中h,w,d,c分别是图像的高度、宽度、深度和通道数。 |
向量序列 | c——- - - - - -年代矩阵,c序列的特征数和年代是序列长度。 |
一维图像序列 | h——- - - - - -c——- - - - - -年代数组,h而且c分别对应于图像的高度和通道数,和年代是序列长度。 小批中的每个序列必须具有相同的序列长度。 |
二维图像序列 | h——- - - - - -w——- - - - - -c——- - - - - -年代数组,h,w,c分别对应图像的高度、宽度和通道数,和年代是序列长度。 小批中的每个序列必须具有相同的序列长度。 |
三维图像序列 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -年代数组,h,w,d,c分别对应图像的高度、宽度、深度和通道数,和年代是序列长度。 小批中的每个序列必须具有相同的序列长度。 |
特性 | c-by-1列向量,其中c是特征的数量。 |
表元素必须包含数字标量、数字行向量或包含数字数组的1乘1单元格数组。
的trainNetwork
函数不支持具有多个序列输入层的网络。金宝app
响应的格式取决于任务的类型。
任务 | 回应格式 |
---|---|
分类 | 绝对标量 |
回归 |
|
Sequence-to-sequence分类 | 1 -年代分类标签序列,其中年代是对应预测器序列的序列长度。 |
Sequence-to-sequence回归 | R——- - - - - -年代矩阵,R回复的数量和年代是对应预测器序列的序列长度。 |
表元素必须包含分类标量、数字标量、数字行向量或包含数字数组的1乘1单元格数组。
此示例展示如何创建用于处理序列数据的自定义小批数据存储。将脚本保存在一个名为MySequenceDatastore.m
.
步骤 | 实现 |
---|---|
|
classdefMySequenceDatastore < matlab.io.Datastore &...matlab.io.datastore.MiniBatchable属性数据存储标签NumClasses SequenceDimension MiniBatchSize结束属性(SetAccess = protected) NumObservations结束属性(Access = private)此属性从数据存储继承CurrentFileIndex结束方法函数ds = MySequenceDatastore(文件夹)构造一个MySequenceDatastore对象创建文件数据存储。readSequence函数为%定义在类定义之后。fds = fileDatastore(文件夹,...“ReadFcn”@readSequence,...“IncludeSubfolders”,真正的);ds。数据存储= fds;从文件夹名中读取标签numObservations = numel(fds.Files);为i = 1:numObservations file = fds.Files{i};Filepath = fileparts(文件);[~,label] = fileparts(filepath);标签{i,1} =标签;结束ds。标签=分类的(标签);ds。NumClasses = numel(唯一的(标签));确定序列维数。定义LSTM时%网络架构,您可以使用此属性来指定sequenceInputLayer的输入大小。X =预览(fds);ds。SequenceDimension = size(X,1);初始化数据存储属性。ds。MiniBatchSize = 128;ds。NumObservations = NumObservations;ds。CurrentFileIndex = 1;结束函数Tf = hasdata(ds)%如果有更多可用数据则返回trueTf = ds。CurrentFileIndex + ds。MiniBatchSize - 1...< = ds.NumObservations;结束函数[data,info] = read(ds)读取一个小批量数据miniBatchSize = ds.MiniBatchSize;Info = struct;为i = 1:miniBatchSize predictors{i,1} = read(ds.Datastore);responses(i,1) = ds.Labels(ds.CurrentFileIndex);ds。CurrentFileIndex = ds。CurrentFileIndex + 1;结束data = preprocessData(ds,predictors,responses);结束函数data = preprocessData(ds,predictors,responses)% data = preprocessData(ds,predictors,responses)预处理%预测器和响应中的数据,并返回表%的数据miniBatchSize = ds.MiniBatchSize;将数据填充到最长序列的长度。sequenceLengths = cellfun(@(X) size(X,2),predictors);maxSequenceLength = max(sequenceLengths);为i = 1:miniBatchSize X = predictors{i};%零填充序列。如果size(X,2) < maxSequenceLength X(:,maxSequenceLength) = 0;结束预测器{i} = X;结束以表形式返回数据。数据=表(预测器,响应);结束函数重置(ds)重置到数据的开始位置重置(ds.Datastore);ds。CurrentFileIndex = 1;结束结束方法(Hidden = true)函数压裂=进展(ds)确定从数据存储读取数据的百分比压裂= (ds。CurrentFileIndex - 1) / ds.NumObservations;结束结束结束结束类定义 readSequence .必须创建此函数才能从mat文件读取序列数据。函数数据= readSequence(文件名)% data = readSequence(filename)从mat文件中读取序列X%文件名S = load(文件名);数据= S.X;结束 |
增加对变金宝app换的支持
要添加对变换的金宝app支持,请首先遵循中的说明实现迷你批处理数据存储然后更新您的实现代码MySequenceDatastore.m
:
定义附加方法
洗牌
.
类中添加了洗牌支持金宝appMySequenceDatastore
类。类中复制代码的位置MySequenceDatastore
实现。
步骤 | 实现 |
---|---|
|
classdefMySequenceDatastore < matlab.io.Datastore &...matlab.io.datastore.MiniBatchable &...matlab.io.datastore.Shuffleable%先前定义的属性……方法%先前定义的方法……函数dsNew = shuffle(ds)% dsNew = shuffle(ds)打乱文件和%对应的标签在数据存储。创建一个数据存储副本dsNew =复制(ds);dsNew。数据年代tore = copy(ds.Datastore); fds = dsNew.Datastore;打乱文件和相应的标签numObservations = dsNew.NumObservations;idx = randperm(numObservations);fds。Files = fds.Files(idx);dsNew。标签= dsNew.Labels(idx);结束结束结束 |
验证自定义小批量数据存储
如果您遵循了这里提供的所有说明,那么您的自定义小批数据存储的实现就完成了。在使用此数据存储之前,请使用中提供的指导原则对其进行限定自定义数据存储的测试指南.