主要内容

使用内存次序列数据列车网络

此示例显示如何通过转换和组合数据存储来训练内存序列数据上的深度学习网络。

转换的数据存储区转换或从底层数据存储读取的数据。您可以使用转换的数据存储作为深度学习应用程序的培训,验证,测试和预测数据集的来源。使用变换的数据存储来读取内存数据或在阅读数据批次时执行特定的预处理操作。当您有包含预测器和标签的单独数据存储时,可以组合它们,以便您可以将数据输入到深度学习网络中。

在培训网络时,软件通过填充,截断或分割输入数据创建相同长度的逐个序列。对于内存数据,培训选项函数为填充和截断输入序列提供选项,但是,对于内存失控数据,必须手动填充并截断序列。

负载培训数据

如[1]和[2]中所述加载日语元音数据集。zip文件Japanesevowels.zip.含有不同长度的序列。该序列分为两个文件夹,火车测试,其分别包含训练序列和测试序列。在这些文件夹中的每一个中,序列被分成子文件夹,它们是从的19.。这些子文件夹的名称是标签名称。垫文件代表每个序列。每个序列是具有12行的矩阵,每个特征为一行,以及每个时间步长的一个列的不同数量的列。行数是序列尺寸,列数是序列长度。

解压缩序列数据。

filename =.“Japanesevowels.zip”;outputfolder = fullfile(tempdir,“Japanesevowels”);解压缩(文件名,outputFolder);

对于培训预测器,创建文件数据存储,并指定读取功能加载功能。这加载函数,将数据从MAT文件加载到结构阵列中。要从培训文件夹中的子文件夹中读取文件,请设置'insertumbfolders'选择真的

foldertrain = fullfile(outputfolder,“火车”);fdspredictretrain = filedataStore(foldertrain,......'readfcn',@加载,......'insertumbfolders',真的);

预览数据存储。返回的结构包含来自第一个文件的单个序列。

预览(FDSPREDICTRATRAIN)
ans =.结构与字段:X:[12×20双]

对于标签,创建文件数据存储,并指定要成为的读取功能readlabel.函数,在示例的末尾定义。这readlabel.函数从子文件夹名称中提取标签。

ClassNames = String(1:9);fdslabeltrain = filedataStore(foldertrain,......'readfcn',@(filename)readlabel(filename,classnames),......'insertumbfolders',真的);

预览数据存储。输出对应于第一个文件的标签。

预览(fdslabeltrain)
ans =.分类1

转换并组合数据存储

要从预测器的数据存储区输入到深度学习网络的序列数据,序列的小批量必须具有相同的长度。使用该转换数据存储Padsequence.在数据存储末尾定义的函数,该焊盘或截断序列具有长度20。

Sequencelength = 20;tdstrain =变换(fdspredictortrain,@(data)padsequence(数据,sequencelength));

预览转换的数据存储。输出对应于来自第一文件的填充序列。

X =预览(TDStrain)
X =1×1个单元阵列{12×20双}

将数据存储的预测器和标签输入到深度学习网络中,将它们组合使用结合功能。

cdstrain =组合(Tdstrain,Fdslabeltrain);

预览组合数据存储。数据存储返回一个1×2个单元格数组。第一元素对应于预测器。第二个元素对应于标签。

预览(CDStrain)
ans =.1×2个单元阵列{12×20双} {[1]}

定义LSTM网络架构

定义LSTM网络架构。指定输入数据的功能数量为输入大小。使用100个隐藏单元指定LSTM层,并输出序列的最后一个元素。最后,指定具有等于类的输出大小的完全连接的图层,然后是Softmax层和分类层。

numfeatures = 12;numclasses = numel(classnames);numhidendunits = 100;层= [......sequenceInputlayer(numfeatures)lstmlayer(numhidentunits,'OutputMode''最后的')全连接列(numclasses)softmaxlayer分类层];

指定培训选项。将求解器设置为'亚当''gradientthreshold'2.将迷你批量大小设置为27并将最大数量的时期设置为75.数据存储不支持混洗,因此设置金宝app'洗牌''绝不'

由于迷你批次具有短序列,因此CPU更适合培训。放'executionenvironment''中央处理器'。在GPU上训练,如果有的话,设置'executionenvironment''汽车'(默认值)。

minibatchsize = 27;选项=培训选项('亚当'......'executionenvironment''中央处理器'......'maxepochs',75,......'minibatchsize',小匹马,......'gradientthreshold'2,......'洗牌''绝不'......'verbose',0,......'plots''培训 - 进步');

使用指定的培训选项列车LSTM网络。

net = trainnetwork(cdstrain,图层,选项);

测试网络

使用与训练数据的相同步骤创建包含所持测试数据的转换数据存储。

foldertest = fullfile(outputfolder,“测试”);fdspredictortest = filedatastore(foldertest,......'readfcn',@加载,......'insertumbfolders',真的);tdstest =变换(fdspredictrest,@(data)padsequence(数据,sequencelength));

使用培训的网络对测试数据进行预测。

ypred =分类(net,tdstest,'minibatchsize',小匹匹匹匹配);

计算测试数据的分类准确性。要获取测试集的标签,请使用读取功能创建文件数据存储readlabel.并指定包含子文件夹。指定输出通过设置垂直连接'统一read'选择真的

fdslabeltest = filedataStore(Foldertest,......'readfcn',@(filename)readlabel(filename,classnames),......'insertumbfolders',真的,......'统一read',真的);ytest = readall(fdslabeltest);
精度=均值(Ypred == ytest)
精度= 0.9351.

功能

readlabel.函数从指定的文件名中提取标签通过类别Classnames.

功能label = readlabel(filename,classnames)filepath = fileparts(文件名);[〜,label] = fileparts(filepath);标签=分类(字符串(标签),classNames);结尾

Padsequence.功能焊盘或截断顺序data.x.具有指定的序列长度并返回一个1×1个单元格中的结果。

功能sequence = padsequence(数据,sequencelength)序列= data.x;[c,s] =尺寸(序列);如果s 别的序列=序列(:,1:sequencelength);结尾序列= {序列};结尾

也可以看看

|||||

相关话题