主要内容

开发自定义小批量数据存储

一个mini-batch数据存储是一种支持批量读取数据的数据存储的实现。万博1manbetx您可以使用一个小批量数据存储作为使用深度学习工具箱™的深度学习应用程序的培训、验证、测试和预测数据集的来源。

要对序列、时间序列或文本数据进行预处理,可以使用本文描述的框架构建自己的迷你批处理数据存储。有关如何使用自定义迷你批处理数据存储的示例,请参见列车网络使用自定义迷你批处理数据存储序列数据

概述

使用自定义数据存储类和对象构建自定义数据存储接口。然后,使用自定义数据存储将数据导入MATLAB®

设计您的自定义小批处理数据存储涉及从matlab.io.Datastorematlab.io.datastore.MiniBatchable类,并实现所需的属性和方法。你也可以在训练中添加洗牌支持。万博1manbetx

处理需求

用于深度学习工具箱中的训练、验证、测试和预测数据集的小批数据存储

matlab.io.Datastorematlab.io.datastore.MiniBatchable

看到实现MiniBatchable数据存储

支持训练期间洗牌的小批数据存储万博1manbetx

matlab.io.Datastorematlab.io.datastore.MiniBatchable,matlab.io.datastore.Shuffleable

看到添加对洗万博1manbetx牌的支持

实现MiniBatchable数据存储

实现一个自定义的迷你批处理数据存储MyDatastore,创建一个脚本MyDatastore.m.该脚本必须在MATLAB路径上,并且应该包含从适当的类继承的代码,并定义所需的方法。在深度学习工具箱中创建用于训练、验证、测试和预测数据集的小批数据存储的代码必须:

除了这些步骤之外,您还可以定义处理和分析数据所需的任何其他属性或方法。

请注意

如果你正在训练一个网络trainingOptions指定“洗牌”作为“一次”“every-epoch”,那么你也必须继承matlab.io.datastore.Shuffleable类。有关更多信息,请参见添加对洗万博1manbetx牌的支持

数据存储读函数必须返回表中的数据。表元素必须是标量、行向量或包含数字数组的1 × 1单元格数组。

对于只有一个输入层的网络,第一列和第二列分别指定预测器和响应。

提示

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

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

数据 格式的预测
二维图像

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

三维图像

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

向量序列

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

二维图像序列

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

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

三维图像序列

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

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

特性

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

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

trainNetwork函数不支持具有多个序列输入层的网络。万博1manbetx

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

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

  • 标量

  • 数值向量

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

Sequence-to-sequence分类

1 -年代类别标签的序列,其中年代为相应预测序列的序列长度。

Sequence-to-sequence回归

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

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

这个例子展示了如何创建一个自定义的迷你批处理数据存储来处理序列数据。将脚本保存到一个名为MySequenceDatastore.m

步骤 实现

  1. 开始定义类。从基类继承matlab.io.Datastorematlab.io.datastore.MiniBatchable类。

  2. 定义属性。

    • 重新定义MiniBatchSizeNumObservations属性。您可以选择为任意一个属性指定其他属性属性。有关更多信息,请参见属性的属性

    • 您还可以定义自定义迷你批处理数据存储特有的属性。

  3. 定义方法。

    • 实现自定义的小批量数据存储构造函数。

    • 实现hasdata方法。

    • 实现方法,该方法必须以表的形式返回数据,其中预测器在第一列,响应在第二列。

      对于序列数据,序列必须是大小相同的矩阵c——- - - - - -年代,在那里c是多少特征和年代是序列长度。的价值年代在小批量之间可能有所不同。

    • 实现重置方法。

    • 实现进步方法。

    • 您还可以为您的自定义迷你批处理数据存储定义独特的方法。

  4. 结束classdef部分。

classdefMySequenceDatastore < matlab.io.Datastore &...matlab.io.datastore.MiniBatchable属性数据存储标签NumClasses序列维度MiniBatchSize结束属性(SetAccess = protected结束属性(访问=私人)%此属性从数据存储继承CurrentFileIndex结束方法函数ds = MySequenceDatastore(文件夹)%构造一个MySequenceDatastore对象%创建文件数据存储。readSequence函数是在类定义之后定义。fds = fileDatastore(文件夹,...“ReadFcn”@readSequence,...“IncludeSubfolders”,真正的);ds。数据存储= fds;%从文件夹名称读取标签numObservations =元素个数(fds.Files);i = 1:numObservations file = fds.Files{i};filepath = fileparts(文件);[~,标签]= fileparts (filepath);标签{我1}=标签;结束ds。=分类标签(标签);ds。NumClasses =元素个数(独特(标签);%确定序列尺寸。当您定义LSTM时%网络架构,您可以使用此属性来%指定sequenceInputLayer的输入大小。X =预览(fds);ds。SequenceDimension =大小(X, 1);%初始化数据存储属性。ds。MiniBatchSize = 128;ds。NumObservations = NumObservations;ds。CurrentFileIndex = 1;结束函数tf = hasdata (ds)%如果有更多可用数据则返回truetf = ds。CurrentFileIndex + ds。MiniBatchSize - 1...< = ds.NumObservations;结束函数(数据、信息)=阅读(ds)读取一个小批量的数据miniBatchSize = ds.MiniBatchSize;信息=结构;i = 1:miniBatchSize predictors{i,1} = read(ds.Datastore);反应(1)我= ds.Labels (ds.CurrentFileIndex);ds。CurrentFileIndex = ds。CurrentFileIndex + 1;结束data = preprocessData (ds,预测反应);结束函数data = preprocessData (ds,预测反应)% data = preprocessData(ds, predicate,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;结束我预测{}= X;结束%以表的形式返回数据。data =表(预测、反应);结束函数重置(ds)%重置到数据的开始重置(ds.Datastore);ds。CurrentFileIndex = 1;结束结束方法(隐藏= true)函数压裂=进步(ds)%确定从数据存储读取数据的百分比压裂= (ds。CurrentFileIndex - 1) / ds.NumObservations;结束结束结束结束类定义
自定义数据存储的read方法的实现使用了一个调用的函数readSequence.必须创建这个函数才能从mat文件中读取序列数据。
函数data = readSequence(文件名)% data = readSequence(filename)从mat文件中读取序列X%文件名S =负载(文件名);数据= S.X;结束

添加对洗万博1manbetx牌的支持

要添加对洗牌的万博1manbetx支持,首先按照说明实现MiniBatchable数据存储然后更新你的实现代码MySequenceDatastore.m:

的示例代码添加了变换支持万博1manbetxMySequenceDatastore类。控件中的垂直省略号指示应该在何处复制代码MySequenceDatastore实现。

步骤 实现

  1. 更新类定义,使之也继承matlab.io.datastore.Shuffleable类。

  2. 为以下内容添加定义洗牌对现有方法部分。

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。文件= fds.Files (idx);dsNew。标签= dsNew.Labels (idx);结束结束结束

验证自定义小批量数据存储

如果您遵循了这里提供的所有说明,那么您的自定义迷你批处理数据存储的实现就完成了。在使用此数据存储之前,请使用自定义数据存储的测试指南

另请参阅

相关的例子

更多关于