这个例子展示了如何通过转换和组合数据存储来训练一个深度学习网络来处理内存不足的序列数据。
经过转换的数据存储转换或处理从底层数据存储读取的数据。可以使用转换后的数据存储作为深度学习应用程序的训练、验证、测试和预测数据集的来源。使用转换后的数据存储来读取内存不足的数据,或者在读取成批数据时执行特定的预处理操作。当您拥有包含预测器和标签的独立数据存储时,您可以将它们组合起来,以便将数据输入到深度学习网络中。
当训练网络时,软件通过填充、截断或分割输入数据来创建相同长度的序列的小批量。对于内存中的数据,则trainingOptions
函数提供了填充和截断输入序列的选项,但是,对于内存不足的数据,必须手动填充和截断序列。
加载在[1]和[2]中描述的日语元音数据集。的压缩文件japaneseVowels.zip
包含不同长度的序列。序列被分成两个文件夹,火车
和测试
,分别包含训练序列和测试序列。在每个文件夹中,序列被划分为子文件夹,子文件夹被编号1
来9
.这些子文件夹的名称就是标签名称。MAT文件表示每个序列。每个序列是一个12行矩阵,每一行代表一个特性,每一列代表不同数量的列,每一列代表一个时间步。行数是序列维数,列数是序列长度。
解压缩序列数据。
文件名=“japaneseVowels.zip”;outputFolder = fullfile (tempdir,“japaneseVowels”);解压缩(文件名,outputFolder);
对于训练预测器,创建一个文件数据存储并将读取函数指定为负载
函数。的负载
函数,将数据从mat文件加载到结构数组中。若要从训练文件夹的子文件夹中读取文件,请设置“IncludeSubfolders”
选项真正的
.
folderTrain = fullfile (outputFolder,“训练”);fdsPredictorTrain = fileDatastore (folderTrain,...“ReadFcn”@load,...“IncludeSubfolders”,真正的);
预览数据存储。返回的结构包含来自第一个文件的单个序列。
预览(fdsPredictorTrain)
ans =结构体字段:X(12×20双):
对于标签,创建一个文件数据存储并指定读函数为readLabel
函数,在示例的末尾定义。的readLabel
函数从子文件夹名称中提取标签。
一会=字符串(1:9);fdsLabelTrain = fileDatastore (folderTrain,...“ReadFcn”@(文件名)readLabel(文件名,类名),...“IncludeSubfolders”,真正的);
预览数据存储。输出对应于第一个文件的标签。
预览(fdsLabelTrain)
ans =分类1
为了将预测器数据存储中的序列数据输入到深度学习网络中,序列的小批量必须具有相同的长度。属性转换数据存储padSequence
函数,在数据存储的末尾定义,它填充或截断序列,使其长度为20。
sequenceLength = 20;tdsTrain = transform(fdpredictortrain,@(data) padSequence(data,sequenceLength));
预览转换后的数据存储。输出对应于第一个文件的填充序列。
X =预览(tdsTrain)
X =1×1单元阵列{12×20双}
要将两个数据存储中的预测器和标签都输入到深度学习网络中,请使用结合
函数。
cdsTrain =结合(tdsTrain fdsLabelTrain);
预览合并的数据存储。该数据存储返回一个1乘2的单元格数组。第一个元素对应于预测器。第二个元素对应于标签。
预览(cdsTrain)
ans =1×2单元阵列{12×20双}{[1]}
定义LSTM网络结构。指定输入数据的特性数量作为输入大小。指定一个包含100个隐藏单元的LSTM层,并输出序列的最后一个元素。最后,指定一个输出大小等于类数量的全连接层,然后是一个softmax层和一个分类层。
numFeatures = 12;numClasses =元素个数(类名);numHiddenUnits = 100;层= [...sequenceInputLayer numFeatures lstmLayer (numHiddenUnits,“OutputMode”,“最后一次”) fullconnectedlayer (numClasses) softmaxLayer classiationlayer];
指定培训选项。将求解器设置为“亚当”
和“GradientThreshold”
2。将小批量大小设置为27,并将最大的epoch数量设置为75。数据存储不支持洗牌,所以设置金宝app“洗牌”
来“永远”
.
因为迷你批较小,序列较短,所以CPU更适合于训练。集“ExecutionEnvironment”
来“cpu”
.要在GPU上训练,如果可用,设置“ExecutionEnvironment”
来“汽车”
(默认值)。
miniBatchSize = 27个;选择= trainingOptions (“亚当”,...“ExecutionEnvironment”,“cpu”,...“MaxEpochs”, 75,...“MiniBatchSize”miniBatchSize,...“GradientThreshold”2,...“洗牌”,“永远”,...“详细”,0,...“阴谋”,“训练进步”);
使用指定的训练选项训练LSTM网络。
网= trainNetwork (cdsTrain层,选项);
使用与训练数据相同的步骤创建包含测试数据的转换数据存储。
folderTest = fullfile (outputFolder,“测试”);fdsPredictorTest = fileDatastore (folderTest,...“ReadFcn”@load,...“IncludeSubfolders”,真正的);tdsTest = transform(fdpredictortest,@(data) padSequence(data, sequenclength));
使用训练好的网络对测试数据进行预测。
tdsTest YPred =分类(净,“MiniBatchSize”, miniBatchSize);
计算测试数据的分类精度。要获得测试集的标签,创建一个带有read函数的文件数据存储readLabel
并指定包含子文件夹。方法指定输出可以垂直连接“UniformRead”
选项真正的
.
fdsLabelTest = fileDatastore (folderTest,...“ReadFcn”@(文件名)readLabel(文件名,类名),...“IncludeSubfolders”,真的,...“UniformRead”,真正的);欧美= readall (fdsLabelTest);
精度=平均值(YPred == YTest)
精度= 0.9351
的readLabel
函数从指定的文件名中通过目录提取标签一会
.
函数label = readLabel(filename,classNames) filepath = fileparts(filename);[~,标签]= fileparts (filepath);标签=分类(字符串(标签),类名);结束
的padSequence
函数插入或截断序列数据。X
以具有指定的序列长度,并以1乘1的单元格返回结果。
函数sequence = padSequence(data,sequenceLength);[C, S] =大小(序列);如果S < sequenclength padding = 0 (C, sequenclength -S);Sequence =[序列填充];其他的序列=序列(:1:sequenceLength);结束序列={序列};结束
lstmLayer
|trainNetwork
|trainingOptions
|sequenceInputLayer
|结合
|变换