主要内容gydF4y2Ba

定义自定义循环深度学习层gydF4y2Ba

如果Deep Learning Toolbox™没有为您的任务提供所需的层,那么您可以使用此示例作为指导来定义自己的自定义层。有关内置层的列表,请参见gydF4y2Ba深度学习层列表gydF4y2Ba.gydF4y2Ba

要定义自定义深度学习层,您可以使用本例中提供的模板,该模板将带您完成以下步骤:gydF4y2Ba

  1. 命名层-给层一个名称,以便您可以在MATLAB中使用它gydF4y2Ba®gydF4y2Ba.gydF4y2Ba

  2. 声明层属性-指定层的属性,包括可学习参数和状态参数。gydF4y2Ba

  3. 创建一个构造函数(可选)-指定如何构造层并初始化其属性。如果您没有指定构造函数,那么在创建时,软件将初始化gydF4y2Ba名字gydF4y2Ba,gydF4y2Ba描述gydF4y2Ba,gydF4y2Ba类型gydF4y2Ba属性与gydF4y2Ba[]gydF4y2Ba并将层输入输出数设置为1。gydF4y2Ba

  4. 创建初始化函数(可选)-指定软件初始化网络时如何初始化可学习参数和状态参数。如果不指定初始化函数,则软件在初始化网络时不初始化参数。gydF4y2Ba

  5. 创建前向函数——指定数据在预测时和训练时如何通过层(前向传播)。gydF4y2Ba

  6. 创建复位状态函数(可选)-指定复位状态参数的方式。gydF4y2Ba

  7. 创建一个反向函数(可选)-指定损失相对于输入数据和可学习参数的导数(反向传播)。如果没有指定向后函数,则向前函数必须支持万博1manbetxgydF4y2BadlarraygydF4y2Ba对象。gydF4y2Ba

在定义层函数时,可以使用gydF4y2BadlarraygydF4y2Ba对象。gydF4y2Ba使用gydF4y2BadlarraygydF4y2Ba对象允许您标记维度,从而使高维数据的处理更加容易。标记哪些维度对应于空间、时间、通道和批处理维度gydF4y2Ba“S”gydF4y2Ba,gydF4y2Ba“T”gydF4y2Ba,gydF4y2Ba“C”gydF4y2Ba,gydF4y2Ba“B”gydF4y2Ba标签,分别。对于未指定尺寸和其他尺寸,请使用gydF4y2Ba“U”gydF4y2Ba标签。为gydF4y2BadlarraygydF4y2Ba对象函数在特定维度上操作时,可以通过格式化方法指定维度标签gydF4y2BadlarraygydF4y2Ba对象,或使用gydF4y2BaDataFormatgydF4y2Ba选择。gydF4y2Ba

使用格式化的gydF4y2BadlarraygydF4y2Ba自定义层中的对象还允许您定义输入和输出具有不同格式的层,例如排列、添加或删除维度的层。例如,您可以定义一个图层,该图层使用以下格式将一小批图像作为输入gydF4y2Ba“SSCB”gydF4y2Ba(spatial, spatial, channel, batch),并以格式输出一个小批量的序列gydF4y2Ba“认知行为治疗”gydF4y2Ba(通道,批次,时间)。使用格式化的gydF4y2BadlarraygydF4y2Ba对象还允许您定义可以对具有不同输入格式的数据进行操作的层,例如,支持具有这些格式的输入的层万博1manbetxgydF4y2Ba“SSCB”gydF4y2Ba(空间、空间、通道、批次)和gydF4y2Ba“认知行为治疗”gydF4y2Ba(通道,批次,时间)。gydF4y2Ba

dlarraygydF4y2Ba对象还支持自动区分。万博1manbetx因此,如果您的转发功能完全支持万博1manbetxgydF4y2BadlarraygydF4y2Ba对象,那么定义向后函数是可选的。gydF4y2Ba

启用对使用格式化的万博1manbetxgydF4y2BadlarraygydF4y2Ba对象中的自定义层转发函数,也继承自gydF4y2Bannet.layer.FormattablegydF4y2Ba类在定义自定义层时。使用示例请参见gydF4y2Ba定义带有格式化输入的自定义深度学习层gydF4y2Ba.gydF4y2Ba

这个例子展示了如何定义一个窥视孔LSTM层gydF4y2Ba[1]gydF4y2Ba,这是一个具有可学习参数的循环层,并将其用于神经网络。gydF4y2Ba窥视孔LSTM层是LSTM层的一种变体,其中栅极计算使用层单元状态。gydF4y2Ba

中间层模板gydF4y2Ba

将中间层模板复制到MATLAB中的新文件中。该模板给出了中间层类定义的结构。概述:gydF4y2Ba

  • 可选gydF4y2Ba属性gydF4y2Ba用于层属性、可学习参数和状态参数的块。gydF4y2Ba

  • 层构造函数。gydF4y2Ba

  • 可选gydF4y2Ba初始化gydF4y2Ba函数。gydF4y2Ba

  • 的gydF4y2Ba预测gydF4y2Ba函数和可选的gydF4y2Ba向前gydF4y2Ba函数。gydF4y2Ba

  • 可选gydF4y2BaresetStategydF4y2Ba函数用于具有状态属性的层。gydF4y2Ba

  • 可选gydF4y2Ba落后的gydF4y2Ba函数。gydF4y2Ba

classdefgydF4y2BamyLayer < nnet.layer.LayergydF4y2Ba%……gydF4y2Ba% & nnet.layer. formatable…%(可选)gydF4y2Ba% & nnet.layer.Acceleratable %(可选)gydF4y2Ba属性gydF4y2Ba%(可选)图层属性。gydF4y2Ba在这里声明图层属性。gydF4y2Ba结束gydF4y2Ba属性gydF4y2Ba(可学的)gydF4y2Ba%(可选)层可学习参数。gydF4y2Ba在这里声明可学习的参数。gydF4y2Ba结束gydF4y2Ba属性gydF4y2Ba(状态)gydF4y2Ba%(可选)层状态参数。gydF4y2Ba在这里声明状态参数。gydF4y2Ba结束gydF4y2Ba属性gydF4y2Ba(可学的,状态)gydF4y2Ba%(可选)嵌套dlnetwork对象,两者都可学习gydF4y2Ba%参数和状态参数。gydF4y2Ba在这里声明带有可学习参数和状态参数的嵌套网络。gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Balayer = myLayer()gydF4y2Ba%(可选)创建一个myLayer。gydF4y2Ba此函数必须与类同名。gydF4y2Ba在这里定义层构造函数。gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba图层=初始化(图层,布局)gydF4y2Ba%(可选)初始化层可学习和状态参数。gydF4y2Ba%gydF4y2Ba%的输入:gydF4y2Ba% layer -初始化的层gydF4y2Ba% layout -数据布局,指定为networkDataLayoutgydF4y2Ba%的对象gydF4y2Ba%gydF4y2Ba%输出:gydF4y2Ba% layer -初始化图层gydF4y2Ba%gydF4y2Ba% -对于具有多个输入的图层,将layout替换为gydF4y2Ba% layout1,…,layoutN, where N is the number of inputs.在这里定义图层初始化函数。gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[Z,state] = predict(layer,X)gydF4y2Ba在预测时,通过层转发输入数据gydF4y2Ba%输出结果和更新状态。gydF4y2Ba%gydF4y2Ba%的输入:gydF4y2Ba% layer -向前传播通过的层gydF4y2Ba% X -输入数据gydF4y2Ba%输出:gydF4y2Ba% Z -层前向函数的输出gydF4y2Ba% state -(可选)更新后的层状态gydF4y2Ba%gydF4y2Ba% -对于具有多个输入的层,将X替换为X1,…,XN,gydF4y2Ba%其中N是输入的个数。gydF4y2Ba% -对于具有多个输出的层,将Z替换为gydF4y2Ba% Z1,…,Z米,在那里米我s the number of outputs.% -对于具有多个状态参数的层,替换stategydF4y2Ba% with state1,…,状态K,在那里K我s the number of state%的参数。gydF4y2Ba在这里定义层预测函数。gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[Z,state,memory] = forward(layer,X)gydF4y2Ba%(可选)通过训练层转发输入数据gydF4y2Ba%时间并输出结果、更新状态和内存gydF4y2Ba%值。gydF4y2Ba%gydF4y2Ba%的输入:gydF4y2Ba% layer -向前传播通过的层gydF4y2Ba% X -层输入数据gydF4y2Ba%输出:gydF4y2Ba% Z -层前向函数的输出gydF4y2Ba% state -(可选)更新后的层状态gydF4y2Ba% memory -(可选)自定义向后的内存值gydF4y2Ba%的功能gydF4y2Ba%gydF4y2Ba% -对于具有多个输入的层,将X替换为X1,…,XN,gydF4y2Ba%其中N是输入的个数。gydF4y2Ba% -对于具有多个输出的层,将Z替换为gydF4y2Ba% Z1,…,Z米,在那里米我s the number of outputs.% -对于具有多个状态参数的层,替换stategydF4y2Ba% with state1,…,状态K,在那里K我s the number of state%的参数。gydF4y2Ba在这里定义层转发函数。gydF4y2Ba结束gydF4y2Ba函数gydF4y2Balayer = resetState(layer)gydF4y2Ba%(可选)复位层状态。gydF4y2Ba在这里定义复位状态函数。gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)gydF4y2Ba%(可选)反向传播损耗的导数gydF4y2Ba%函数通过层。gydF4y2Ba%gydF4y2Ba%的输入:gydF4y2Ba% layer -要反向传播的层gydF4y2Ba% X -层输入数据gydF4y2Ba% Z -层输出数据gydF4y2Ba% dLdZ -损耗对层的导数gydF4y2Ba%输出gydF4y2Ba% dLdSout -(可选)相对损失的导数gydF4y2Ba状态输出百分比gydF4y2Ba% memory - forward函数的内存值gydF4y2Ba%输出:gydF4y2Ba% dLdX -损耗相对于层输入的导数gydF4y2Ba% dLdW -(可选)损失的导数gydF4y2Ba%可学习参数gydF4y2Ba% dLdSin -(可选)损失对的导数gydF4y2Ba%状态输入gydF4y2Ba%gydF4y2Ba% -对于具有状态参数的层,向后语法必须gydF4y2Ba%包含dLdSout和dLdSin,或者两者都不包含。gydF4y2Ba% -对于具有多个输入的层,将X和dLdX替换为gydF4y2Ba% X1,…,XN和dLdX1,...,dLdXN, respectively, where N is%输入的个数。gydF4y2Ba% -对于具有多个输出的层,将Z和dlZ替换为gydF4y2Ba% Z1,…,Z米和dLdZ,...,dLdZM, respectively, where M is the%输出数。gydF4y2Ba% -对于具有多个可学习参数的层,替换gydF4y2Ba% dLdW与dLdW1,…,dLdWP, where P is the number of%可学习参数。gydF4y2Ba% -对于具有多个状态参数的层,替换dLdSingydF4y2Ba%和dLdSout与dLdSin1,…、dLdSinK和gydF4y2Ba% dLdSout1,…,dldSoutK, respectively, where K is the number%的状态参数。gydF4y2Ba在这里定义图层反向函数。gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

名字层gydF4y2Ba

首先,给图层起一个名字。在类文件的第一行中,替换现有的名称gydF4y2BamyLayergydF4y2Ba与gydF4y2BapeepholeLSTMLayergydF4y2Ba.允许层输出不同的数据格式,例如使用格式的数据gydF4y2Ba“认知行为治疗”gydF4y2Ba(通道,批次,时间)用于序列输出和格式gydF4y2Ba“CB”gydF4y2Ba(通道,批量)用于单个时间步长或特征输出,还包括gydF4y2Bannet.layer.FormattablegydF4y2Bamixin。gydF4y2Ba

classdefgydF4y2BapeepholeLSTMLayer < nnet.layer.Layer & nnet.layer. formatablegydF4y2Ba…gydF4y2Ba结束gydF4y2Ba

接下来,重命名gydF4y2BamyLayergydF4y2Ba构造函数(类中的第一个函数)gydF4y2Ba方法gydF4y2BaSection),使其具有与图层相同的名称。gydF4y2Ba

方法gydF4y2Ba函数gydF4y2Balayer = peepholeLSTMLayer()…gydF4y2Ba结束gydF4y2Ba…gydF4y2Ba结束gydF4y2Ba

保存层gydF4y2Ba

保存图层类文件在一个新文件中gydF4y2BapeepholeLSTMLayer.mgydF4y2Ba.文件名称必须与层名匹配。要使用该层,必须将文件保存在当前文件夹或MATLAB路径上的文件夹中。gydF4y2Ba

声明属性、状态和可学习参数gydF4y2Ba

属性中声明图层属性gydF4y2Ba属性gydF4y2Ba节中,层的状态gydF4y2Ba属性(状态)gydF4y2Ba节中可学习的参数gydF4y2Ba属性(可学的)gydF4y2Ba部分。gydF4y2Ba

默认情况下,自定义中间层具有这些属性。中不要声明这些属性gydF4y2Ba属性gydF4y2Ba部分。gydF4y2Ba

财产gydF4y2Ba 描述gydF4y2Ba
名字gydF4y2Ba 图层名称,指定为字符向量或字符串标量。为gydF4y2Ba层gydF4y2Ba数组输入gydF4y2BatrainNetworkgydF4y2Ba,gydF4y2BaassembleNetworkgydF4y2Ba,gydF4y2BalayerGraphgydF4y2Ba,gydF4y2BadlnetworkgydF4y2Ba函数会自动将名称分配给具有该名称的层gydF4y2Ba''gydF4y2Ba.gydF4y2Ba
描述gydF4y2Ba

层的一行描述,指定为字符串标量或字符向量。当图层显示在gydF4y2Ba层gydF4y2Ba数组中。gydF4y2Ba

如果不指定层描述,则软件显示层类名称。gydF4y2Ba

类型gydF4y2Ba

层的类型,指定为字符向量或字符串标量。的价值gydF4y2Ba类型gydF4y2Ba控件中显示该层时出现gydF4y2Ba层gydF4y2Ba数组中。gydF4y2Ba

如果不指定层类型,则软件显示层类名称。gydF4y2Ba

NumInputsgydF4y2Ba 层的输入数,指定为正整数。如果不指定此值,则软件会自动设置gydF4y2BaNumInputsgydF4y2Ba到名字的数量gydF4y2BaInputNamesgydF4y2Ba.缺省值为1。gydF4y2Ba
InputNamesgydF4y2Ba 输入图层的名称,指定为字符向量的单元数组。如果不指定此值,则gydF4y2BaNumInputsgydF4y2Ba大于1,则软件自动设置gydF4y2BaInputNamesgydF4y2Ba来gydF4y2Ba{“三机”,…,“客栈”}gydF4y2Ba,在那里gydF4y2BaNgydF4y2Ba等于gydF4y2BaNumInputsgydF4y2Ba.默认值为gydF4y2Ba{'在'}gydF4y2Ba.gydF4y2Ba
NumOutputsgydF4y2Ba 层的输出数,指定为正整数。如果不指定此值,则软件会自动设置gydF4y2BaNumOutputsgydF4y2Ba到名字的数量gydF4y2BaOutputNamesgydF4y2Ba.缺省值为1。gydF4y2Ba
OutputNamesgydF4y2Ba 输出层的名称,指定为字符向量的单元数组。如果不指定此值,则gydF4y2BaNumOutputsgydF4y2Ba大于1,则软件自动设置gydF4y2BaOutputNamesgydF4y2Ba来gydF4y2Ba{着干活,…,“outM”}gydF4y2Ba,在那里gydF4y2Ba米gydF4y2Ba等于gydF4y2BaNumOutputsgydF4y2Ba.默认值为gydF4y2Ba{“出”}gydF4y2Ba.gydF4y2Ba

如果层没有其他属性,那么你可以省略gydF4y2Ba属性gydF4y2Ba部分。gydF4y2Ba

提示gydF4y2Ba

如果您正在创建具有多个输入的图层,那么您必须设置gydF4y2BaNumInputsgydF4y2Ba或gydF4y2BaInputNamesgydF4y2Ba属性在层构造函数。如果您正在创建具有多个输出的图层,那么您必须设置gydF4y2BaNumOutputsgydF4y2Ba或gydF4y2BaOutputNamesgydF4y2Ba属性在层构造函数。gydF4y2Ba使用示例请参见gydF4y2Ba定义具有多个输入的自定义深度学习层gydF4y2Ba.gydF4y2Ba

类中声明以下层属性gydF4y2Ba属性gydF4y2Ba部分:gydF4y2Ba

  • NumHiddenUnitsgydF4y2Ba-在窥视孔LSTM操作中隐藏的单元数gydF4y2Ba

  • OutputModegydF4y2Ba-指示层返回序列还是单个时间步长的标志gydF4y2Ba

属性gydF4y2Ba%图层属性。gydF4y2BaNumHiddenUnits OutputModegydF4y2Ba结束gydF4y2Ba

窥视孔LSTM层有四个可学习的参数:输入权值、循环权值、窥视孔权值和偏置。类中声明这些可学习的参数gydF4y2Ba属性(可学的)gydF4y2Ba包含名称的部分gydF4y2BaInputWeightsgydF4y2Ba,gydF4y2BaRecurrentWeightsgydF4y2Ba,gydF4y2BaPeepholeWeightsgydF4y2Ba,gydF4y2Ba偏见gydF4y2Ba,分别。gydF4y2Ba

属性gydF4y2Ba(可学的)gydF4y2Ba%层可学习参数。gydF4y2Bainputwights recurrentwights PeepholeWeights BiasgydF4y2Ba结束gydF4y2Ba

窥视孔LSTM层有两个状态参数:隐藏状态和单元状态。类中声明这些状态参数gydF4y2Ba属性(状态)gydF4y2Ba包含名称的部分gydF4y2BaHiddenStategydF4y2Ba和gydF4y2BaCellStategydF4y2Ba,分别。gydF4y2Ba

属性gydF4y2Ba(状态)gydF4y2Ba%层状态参数。gydF4y2BaHiddenState CellStategydF4y2Ba结束gydF4y2Ba

包含自定义层和状态参数的网络并行训练gydF4y2BatrainNetworkgydF4y2Ba功能不支持。万博1manbetx当你训练一个带有状态参数的自定义层的网络时gydF4y2BaExecutionEnvironmentgydF4y2Ba培训选项必须是gydF4y2Ba“汽车”gydF4y2Ba,gydF4y2Ba“图形”gydF4y2Ba,或gydF4y2Ba“cpu”gydF4y2Ba.gydF4y2Ba

Create Constructor函数gydF4y2Ba

创建构造图层和初始化图层属性的函数。指定创建层所需的任何变量作为构造函数的输入。gydF4y2Ba

窥视孔LSTM层构造函数需要两个输入参数(隐藏单元的数量和输入通道的数量)和两个可选参数(层名称和输出模式)。指定两个输入参数gydF4y2BanumHiddenUnitsgydF4y2Ba和gydF4y2BainputSizegydF4y2Ba在gydF4y2BapeepholeLSTMLayergydF4y2Ba函数分别对应于隐藏单元的数量和输入通道的数量。将可选输入参数指定为带有名称的单个参数gydF4y2Baarg游戏gydF4y2Ba.在函数的顶部添加注释,解释函数的语法。gydF4y2Ba

函数gydF4y2Balayer = peepholeLSTMLayer(numHiddenUnits,inputSize,args)gydF4y2Ba%PEEPHOLELSTMLAYER窥视孔LSTM层gydF4y2Ba% layer = peepholeLSTMLayer(numHiddenUnits,inputSize)gydF4y2Ba%创建具有指定数量的窥视孔LSTM层gydF4y2Ba%隐藏单元和输入通道。gydF4y2Ba%gydF4y2Ba% layer = peepholeLSTMLayer(numHiddenUnits,inputSize,Name=Value)gydF4y2Ba%创建一个窥视孔LSTM层并指定附加的gydF4y2Ba%选项使用一个或多个名称-值参数:gydF4y2Ba%gydF4y2Ba% Name -层的名称,指定为字符串。gydF4y2Ba%默认为“”。gydF4y2Ba%gydF4y2Ba% OutputMode -输出模式,指定为gydF4y2Ba%:gydF4y2Ba% "sequence" -输出整个序列gydF4y2Ba%的数据。gydF4y2Ba%gydF4y2Ba% "last" -输出最后一个时间步长gydF4y2Ba%的数据。gydF4y2Ba%默认为“sequence”。gydF4y2Ba…gydF4y2Ba结束gydF4y2Ba

初始化图层属性gydF4y2Ba

在构造函数中初始化层属性。替换注释gydF4y2Ba%层构造函数在这里gydF4y2Ba使用初始化图层属性的代码。不要在构造函数中初始化可学习或状态参数,在gydF4y2Ba初始化gydF4y2Ba函数来代替。gydF4y2Ba

解析输入参数gydF4y2Ba参数gydF4y2Ba阻塞并设置gydF4y2Ba名字gydF4y2Ba输出属性。gydF4y2Ba

参数gydF4y2BanumHiddenUnits输入大小参数。Name =gydF4y2Ba”“gydF4y2Ba;arg游戏。OutputMode = "sequence"gydF4y2Ba结束gydF4y2Ba层。NumHiddenUnits = numHiddenUnits; layer.Name = args.Name; layer.OutputMode = args.OutputMode;

为图层设置一行的描述gydF4y2Ba描述gydF4y2Ba层的属性。设置描述来描述图层的类型和大小。gydF4y2Ba

%设置图层描述。gydF4y2Ba层。描述=gydF4y2Ba“窥视孔LSTM与”gydF4y2BanumHiddenUnits +gydF4y2Ba“隐藏单位”gydF4y2Ba;gydF4y2Ba

查看完整的构造函数。gydF4y2Ba

函数gydF4y2Balayer = peepholeLSTMLayer(numHiddenUnits,inputSize,args)gydF4y2Ba%PEEPHOLELSTMLAYER PEEPHOLELSTMLAYER % Layer = PEEPHOLELSTMLAYER (numHiddenUnits) %创建一个具有指定数量%隐藏单元的peepholelstm层。% % layer = peepholeLSTMLayer(numHiddenUnits,Name=Value) %创建一个窥视孔LSTM层,并使用一个或多个Name - Value参数指定额外的%选项:% % Name -层的名称,以字符串形式指定。%默认为“”。% % OutputMode -输出模式,指定为以下%之一:% "sequence" -输出数据的整个序列%。% % "last" -输出数据的最后一个时间步长%。%默认为“sequence”。gydF4y2Ba解析输入参数。gydF4y2Ba参数gydF4y2BanumHiddenUnits输入大小参数。Name =gydF4y2Ba”“gydF4y2Ba;arg游戏。OutputMode =gydF4y2Ba“序列”gydF4y2Ba;gydF4y2Ba结束gydF4y2Ba层。NumHiddenUnits = numHiddenUnits; layer.Name = args.Name; layer.OutputMode = args.OutputMode;%设置图层描述。gydF4y2Ba层。描述=gydF4y2Ba“窥视孔LSTM与”gydF4y2BanumHiddenUnits +gydF4y2Ba“隐藏单位”gydF4y2Ba;gydF4y2Ba结束gydF4y2Ba

使用这个构造函数,命令gydF4y2BaOutputMode peepholeLSTMLayer(200年,12日=“最后”,Name =“窥孔”)gydF4y2Ba创建一个窥视孔LSTM层,其中包含200个隐藏单元,输入大小为12,名称为gydF4y2Ba“窥孔”gydF4y2Ba,输出窥视孔LSTM操作的最后一次时间步长。gydF4y2Ba

Create Initialize函数gydF4y2Ba

创建软件初始化网络时初始化层可学习和状态参数的函数。确保该函数只在属性为空时初始化可学习参数和状态参数,否则从MAT文件加载网络时软件会覆盖。gydF4y2Ba

因为在网络准备好使用之前,输入数据的大小是未知的,所以必须创建一个初始化函数来初始化可学习参数和状态参数gydF4y2BanetworkDataLayoutgydF4y2Ba软件提供给函数的对象。网络数据布局对象包含有关预期输入数据的大小和格式的信息。创建一个初始化函数,使用大小和格式信息初始化可学习参数和状态参数,使它们具有正确的大小。gydF4y2Ba

使用gloot初始化初始化输入权重。使用正交初始化初始化循环权重。使用单元遗忘门归一化初始化偏置。这段代码使用了helper函数gydF4y2BainitializeGlorotgydF4y2Ba,gydF4y2BainitializeOrthogonalgydF4y2Ba,gydF4y2BainitializeUnitForgetGategydF4y2Ba.要访问这些函数,请打开gydF4y2Ba在网络中包含自定义层gydF4y2Ba节作为实时脚本。有关初始化权重的详细信息,请参见gydF4y2Ba初始化模型函数的可学习参数gydF4y2Ba.gydF4y2Ba

注意,窥视孔LSTM层和标准LSTM层的循环权值大小不同。窥视孔LSTM层对候选单元计算不需要循环权值,因此循环权值为AgydF4y2Ba3 * NumHiddenUnitsgydF4y2Ba——- - - - - -gydF4y2BaNumHiddenUnitsgydF4y2Ba数组中。gydF4y2Ba

方法初始化状态参数gydF4y2BaresetStategydF4y2Ba节中定义的函数gydF4y2BaCreate Reset State命令功能gydF4y2Ba.gydF4y2Ba

函数gydF4y2Ba图层=初始化(图层,布局)gydF4y2Ba% layer = initialize(layer,layout)初始化图层gydF4y2Ba%可学习参数和状态参数。gydF4y2Ba%gydF4y2Ba%的输入:gydF4y2Ba% layer -初始化的层。gydF4y2Ba% layout -数据布局,指定为gydF4y2Ba% networkDataLayout对象。gydF4y2Ba%gydF4y2Ba%输出:gydF4y2Ba% layer -初始化图层。gydF4y2BanumHiddenUnits = layer.NumHiddenUnits;gydF4y2Ba%查找频道数。gydF4y2BaIdx = finddim(布局,gydF4y2Ba“C”gydF4y2Ba);numChannels = layout.Size(idx);gydF4y2Ba初始化输入权重。gydF4y2Ba如果gydF4y2Baisempty(layer.InputWeights) sz = [4*numHiddenUnits numChannels];numOut = 4*numHiddenUnits;numIn = numChannels;层。InputWeights = initializeGlorot(sz,numOut,numIn);gydF4y2Ba结束gydF4y2Ba初始化循环权值。gydF4y2Ba如果gydF4y2Baisempty(layer.RecurrentWeights) sz = [4*numHiddenUnits];层。RecurrentWeights = initializeOrthogonal(sz);结束gydF4y2Ba初始化窥视孔权重。gydF4y2Ba如果gydF4y2Baisempty(layer.PeepholeWeights) sz = [3*numHiddenUnits 1];numOut = 3*numHiddenUnits;numIn = 1;层。PeepholeWeights = initializeGlorot(sz,numOut,numIn);gydF4y2Ba结束gydF4y2Ba%初始化偏差。gydF4y2Ba如果gydF4y2Baisempty (layer.Bias)层。偏见=initializeUnitForgetGate(numHiddenUnits);gydF4y2Ba结束gydF4y2Ba%初始化隐藏状态。gydF4y2Ba如果gydF4y2Baisempty (layer.HiddenState)层。HiddenState=0(numHiddenUnits,1);gydF4y2Ba结束gydF4y2Ba%初始化单元格状态。gydF4y2Ba如果gydF4y2Baisempty (layer.CellState)层。CellState=0(numHiddenUnits,1);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

创建预测函数gydF4y2Ba

创建层前向函数用于预测时间和训练时间。gydF4y2Ba

创建一个名为gydF4y2Ba预测gydF4y2Ba它通过层向前传播数据gydF4y2Ba预测的时间gydF4y2Ba并输出结果。gydF4y2Ba

的gydF4y2Ba预测gydF4y2Ba函数语法取决于层的类型。gydF4y2Ba

  • Z = predict(layer,X)gydF4y2Ba转发输入数据gydF4y2BaXgydF4y2Ba通过层并输出结果gydF4y2BaZgydF4y2Ba,在那里gydF4y2Ba层gydF4y2Ba具有单个输入和单个输出。gydF4y2Ba

  • [Z,state] = predict(layer,X)gydF4y2Ba还输出更新后的状态参数gydF4y2Ba状态gydF4y2Ba,在那里gydF4y2Ba层gydF4y2Ba只有一个状态参数。gydF4y2Ba

你可以调整具有多个输入、多个输出或多个状态参数的层的语法:gydF4y2Ba

  • 对于具有多个输入的层,替换gydF4y2BaXgydF4y2Ba与gydF4y2BaX1,…,XNgydF4y2Ba,在那里gydF4y2BaNgydF4y2Ba是输入的个数。的gydF4y2BaNumInputsgydF4y2Ba属性必须匹配gydF4y2BaNgydF4y2Ba.gydF4y2Ba

  • 对于具有多个输出的层,替换gydF4y2BaZgydF4y2Ba与gydF4y2BaZ1,…,ZM评选gydF4y2Ba,在那里gydF4y2Ba米gydF4y2Ba是输出的个数。的gydF4y2BaNumOutputsgydF4y2Ba属性必须匹配gydF4y2Ba米gydF4y2Ba.gydF4y2Ba

  • 对于具有多个状态参数的层,替换gydF4y2Ba状态gydF4y2Ba与gydF4y2Bastate1,…,stateKgydF4y2Ba,在那里gydF4y2BaKgydF4y2Ba为状态参数的个数。gydF4y2Ba

提示gydF4y2Ba

如果层的输入数量可以变化,则使用gydF4y2Ba变长度输入宗量gydF4y2Ba而不是gydF4y2BaX1,…,XNgydF4y2Ba.在这种情况下,gydF4y2Ba变长度输入宗量gydF4y2Ba输入的单元格数组在哪里gydF4y2Ba变长度输入宗量{我}gydF4y2Ba对应于gydF4y2Ba西gydF4y2Ba.gydF4y2Ba

如果输出的数量可以变化,则使用gydF4y2BavarargoutgydF4y2Ba而不是gydF4y2BaZ1,…,锌gydF4y2Ba.在这种情况下,gydF4y2BavarargoutgydF4y2Ba是输出的单元格数组,在哪里gydF4y2Bavarargout {j}gydF4y2Ba对应于gydF4y2BaZjgydF4y2Ba.gydF4y2Ba

提示gydF4y2Ba

如果自定义层有gydF4y2BadlnetworkgydF4y2Ba对象获取可学习参数,然后在gydF4y2Ba预测gydF4y2Ba功能的自定义层,使用gydF4y2Ba预测gydF4y2Ba的函数gydF4y2BadlnetworkgydF4y2Ba.当你这样做的时候gydF4y2BadlnetworkgydF4y2Ba对象gydF4y2Ba预测gydF4y2Ba函数使用适当的层操作进行预测。如果gydF4y2BadlnetworkgydF4y2Ba具有状态参数,则还返回网络状态。gydF4y2Ba

因为窥视孔LSTM层只有一个输入、一个输出和两个状态参数,所以gydF4y2Ba预测gydF4y2Ba对于窥视孔LSTM层为gydF4y2Ba[Z,hiddenState,cellState] = predict(layer,X)gydF4y2Ba.gydF4y2Ba

缺省情况下,该层使用gydF4y2Ba预测gydF4y2Ba作为训练时的正向函数。若要在训练时使用不同的前向函数,或保留自定义后向函数所需的值,还必须创建名为gydF4y2Ba向前gydF4y2Ba.gydF4y2Ba

因为层继承自gydF4y2Bannet.layer.FormattablegydF4y2Ba,层输入被格式化gydF4y2BadlarraygydF4y2Ba对象和gydF4y2Ba预测gydF4y2Ba函数还必须输出格式化的数据gydF4y2BadlarraygydF4y2Ba对象。gydF4y2Ba

在时间步长的隐藏状态gydF4y2BatgydF4y2Ba是由gydF4y2Ba

hgydF4y2Ba tgydF4y2Ba =gydF4y2Ba 双曲正切gydF4y2Ba (gydF4y2Ba cgydF4y2Ba tgydF4y2Ba )gydF4y2Ba ⊙gydF4y2Ba ogydF4y2Ba tgydF4y2Ba ,gydF4y2Ba

⊙gydF4y2Ba 表示Hadamard积(向量的逐元素乘法)。gydF4y2Ba

单元在时间步长的状态gydF4y2BatgydF4y2Ba是由gydF4y2Ba

cgydF4y2Ba tgydF4y2Ba =gydF4y2Ba ggydF4y2Ba tgydF4y2Ba ⊙gydF4y2Ba 我gydF4y2Ba tgydF4y2Ba +gydF4y2Ba cgydF4y2Ba tgydF4y2Ba −gydF4y2Ba 1gydF4y2Ba ⊙gydF4y2Ba fgydF4y2Ba tgydF4y2Ba .gydF4y2Ba

下面的公式描述了在时间步长的分量gydF4y2BatgydF4y2Ba.gydF4y2Ba

组件gydF4y2Ba 公式gydF4y2Ba
输入门gydF4y2Ba 我gydF4y2Ba tgydF4y2Ba =gydF4y2Ba σgydF4y2Ba ggydF4y2Ba (gydF4y2Ba WgydF4y2Ba 我gydF4y2Ba xgydF4y2Ba tgydF4y2Ba +gydF4y2Ba RgydF4y2Ba 我gydF4y2Ba hgydF4y2Ba tgydF4y2Ba −gydF4y2Ba 1gydF4y2Ba +gydF4y2Ba pgydF4y2Ba 我gydF4y2Ba ⊙gydF4y2Ba cgydF4y2Ba tgydF4y2Ba −gydF4y2Ba 1gydF4y2Ba +gydF4y2Ba bgydF4y2Ba 我gydF4y2Ba )gydF4y2Ba
忘记门gydF4y2Ba fgydF4y2Ba tgydF4y2Ba =gydF4y2Ba σgydF4y2Ba ggydF4y2Ba (gydF4y2Ba WgydF4y2Ba fgydF4y2Ba xgydF4y2Ba tgydF4y2Ba +gydF4y2Ba RgydF4y2Ba fgydF4y2Ba hgydF4y2Ba tgydF4y2Ba −gydF4y2Ba 1gydF4y2Ba +gydF4y2Ba pgydF4y2Ba fgydF4y2Ba ⊙gydF4y2Ba cgydF4y2Ba tgydF4y2Ba −gydF4y2Ba 1gydF4y2Ba +gydF4y2Ba bgydF4y2Ba fgydF4y2Ba )gydF4y2Ba
细胞的候选人gydF4y2Ba ggydF4y2Ba tgydF4y2Ba =gydF4y2Ba σgydF4y2Ba cgydF4y2Ba (gydF4y2Ba WgydF4y2Ba ggydF4y2Ba xgydF4y2Ba tgydF4y2Ba +gydF4y2Ba RgydF4y2Ba hgydF4y2Ba hgydF4y2Ba tgydF4y2Ba −gydF4y2Ba 1gydF4y2Ba +gydF4y2Ba bgydF4y2Ba ggydF4y2Ba )gydF4y2Ba
输出门gydF4y2Ba ogydF4y2Ba tgydF4y2Ba =gydF4y2Ba σgydF4y2Ba ggydF4y2Ba (gydF4y2Ba WgydF4y2Ba ogydF4y2Ba xgydF4y2Ba tgydF4y2Ba +gydF4y2Ba RgydF4y2Ba ogydF4y2Ba hgydF4y2Ba tgydF4y2Ba −gydF4y2Ba 1gydF4y2Ba +gydF4y2Ba pgydF4y2Ba ogydF4y2Ba ⊙gydF4y2Ba cgydF4y2Ba tgydF4y2Ba +gydF4y2Ba bgydF4y2Ba ogydF4y2Ba )gydF4y2Ba

注意,输出门计算需要更新的单元状态gydF4y2Ba cgydF4y2Ba tgydF4y2Ba .gydF4y2Ba

在这些计算中,gydF4y2Ba σgydF4y2Ba ggydF4y2Ba 和gydF4y2Ba σgydF4y2Ba cgydF4y2Ba 表示门和状态激活函数。对于窥视孔LSTM层,分别使用s型和双曲正切函数作为门激活函数和状态激活函数。gydF4y2Ba

中实现此操作gydF4y2Ba预测gydF4y2Ba函数。由于该层不需要用于训练的不同前向函数或用于自定义后向函数的内存值,因此可以删除gydF4y2Ba向前gydF4y2Ba函数从类文件。在函数的顶部添加注释,解释函数的语法。gydF4y2Ba

提示gydF4y2Ba

如果使用函数预分配数组,例如gydF4y2Ba0gydF4y2Ba,那么必须确保这些数组的数据类型与层函数输入一致。要创建与另一个数组具有相同数据类型的零数组,请使用gydF4y2Ba“喜欢”gydF4y2Ba选择gydF4y2Ba0gydF4y2Ba.例如,初始化大小为0的数组gydF4y2Ba深圳gydF4y2Ba使用与数组相同的数据类型gydF4y2BaXgydF4y2Ba,使用gydF4y2BaZ = 0 (sz,"like",X)gydF4y2Ba.gydF4y2Ba

函数gydF4y2Ba[Z,cellState,hiddenState] = predict(layer,X)gydF4y2Ba%PREDICT Peephole LSTM PREDICT function % [Z,hiddenState,cellState] = PREDICT (layer,X) forward %通过层传播数据X,并返回%层输出Z和更新的隐藏状态和单元状态。X %是格式为“CBT”的数组,Z是格式为“CB”或“CBT”的数组,具体取决于层的OutputMode %属性。gydF4y2Ba%初始化序列输出。gydF4y2BanumHiddenUnits = layer.NumHiddenUnits;miniBatchSize = size(X),finddim(X),gydF4y2Ba“B”gydF4y2Ba));numTimeSteps = size(X),finddim(X),gydF4y2Ba“T”gydF4y2Ba));gydF4y2Ba如果gydF4y2Ba层。OutputMode = =gydF4y2Ba“序列”gydF4y2BaZ = 0 (numHiddenUnits,miniBatchSize,numTimeSteps,gydF4y2Ba“喜欢”gydF4y2Ba, X);Z = darray (Z,gydF4y2Ba“认知行为治疗”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba%计算WX + b。gydF4y2BaX = stripdims(X);WX = pagemtimes(layer.InputWeights,X) + layer.Bias;gydF4y2Ba%连接的权重数组的索引。gydF4y2Baidx1 = 1:numHiddenUnits;idx2 = 1+numHiddenUnits:2*numHiddenUnits;idx3 = 1+2*numHiddenUnits:3*numHiddenUnits;idx4 = 1+3*numHiddenUnits:4*numHiddenUnits;gydF4y2Ba%初始状态。gydF4y2BahiddenState = layer.HiddenState;cellState = layer.CellState;gydF4y2Ba%随时间步长循环。gydF4y2Ba为gydF4y2Bat = 1:numTimeStepsgydF4y2Ba%计算R*h_{t-1}。gydF4y2BaRht =层。RecurrentWeights * hiddenState;%计算p*c_{t-1}。gydF4y2Bapict = layer.PeepholeWeights(idx1) .* cellState;pfct = layer.PeepholeWeights(idx2) .* cellState;gydF4y2Ba%门计算。gydF4y2Ba它= sigmoid(WX(idx1,:,t) + Rht(idx1,:) + pict);ft = sigmoid(WX(idx2,:,t) + Rht(idx2,:) + pfct);gt = tanh(WX(idx3,:,t) + Rht(idx3,:));gydF4y2Ba%使用更新的单元格状态计算。gydF4y2BacellState = gt .* it + cellState .* ft;poct = layer.PeepholeWeights(idx3) .* cellState;t = s (WX(idx4,:,t) + rt (idx4,:) + c);gydF4y2Ba%更新隐藏状态。gydF4y2BahiddenState = tanh(cellState) .* ot;gydF4y2Ba%更新序列输出。gydF4y2Ba如果gydF4y2Ba层。OutputMode = =gydF4y2Ba“序列”gydF4y2BaZ(:,:,t) = hiddenState;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba%上次输出的时间步长。gydF4y2Ba如果gydF4y2Ba层。OutputMode = =gydF4y2Ba“最后一次”gydF4y2BaZ = darray (hiddenState;gydF4y2Ba“CB”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

因为gydF4y2Ba预测gydF4y2BaFunction只使用支持万博1manbetxgydF4y2BadlarraygydF4y2Ba对象,定义gydF4y2Ba落后的gydF4y2Ba函数是可选的。的函数列表万博1manbetxgydF4y2BadlarraygydF4y2Ba对象,看到gydF4y2Ba支持数组的函数列表万博1manbetxgydF4y2Ba.gydF4y2Ba

Create Reset State命令功能gydF4y2Ba

当gydF4y2BaDAGNetworkgydF4y2Ba或gydF4y2BaSeriesNetworkgydF4y2Ba对象包含具有状态参数的层,您可以使用属性进行预测和更新层状态gydF4y2BapredictAndUpdateStategydF4y2Ba和gydF4y2BaclassifyAndUpdateStategydF4y2Ba功能。命令可以重置网络状态gydF4y2BaresetStategydF4y2Ba函数。gydF4y2Ba

的gydF4y2BaresetStategydF4y2Ba函数gydF4y2BaDAGNetworkgydF4y2Ba,gydF4y2BaSeriesNetworkgydF4y2Ba,gydF4y2BadlnetworkgydF4y2Ba默认情况下,对象对带有状态参数的自定义层没有影响。控件的图层行为gydF4y2BaresetStategydF4y2Ba函数为网络对象,定义可选层gydF4y2BaresetStategydF4y2Ba层定义中重置状态参数的函数。gydF4y2Ba

的gydF4y2BaresetStategydF4y2Ba函数必须具有语法gydF4y2Balayer = resetState(layer)gydF4y2Ba,其中返回的层具有重置状态属性。gydF4y2Ba

的gydF4y2BaresetStategydF4y2Ba函数不能设置任何层属性,除了可学习属性和状态属性。如果该函数设置了其他层的属性,那么该层的行为可能会出乎意料。gydF4y2Ba(因为R2023a)gydF4y2Ba

创建一个名为gydF4y2BaresetStategydF4y2Ba这将层状态参数重置为0向量。gydF4y2Ba

函数gydF4y2Balayer = resetState(layer)gydF4y2Ba%RESETSTATE重置层状态% layer = RESETSTATE (layer)重置%层的状态属性。gydF4y2BanumHiddenUnits = layer.NumHiddenUnits;层。HiddenState = 0 (numHiddenUnits,1);层。CellState = 0 (numHiddenUnits,1);gydF4y2Ba结束gydF4y2Ba

完成一层gydF4y2Ba

查看完成的图层类文件。gydF4y2Ba

classdefgydF4y2BapeepholeLSTMLayer < nnet.layer.Layer & nnet.layer. formatablegydF4y2Ba%PEEPHOLELSTMLAYER窥视孔LSTM层gydF4y2Ba属性gydF4y2Ba%图层属性。gydF4y2BaNumHiddenUnits OutputModegydF4y2Ba结束gydF4y2Ba属性gydF4y2Ba(可学的)gydF4y2Ba%层可学习参数。gydF4y2Bainputwights recurrentwights PeepholeWeights BiasgydF4y2Ba结束gydF4y2Ba属性gydF4y2Ba(状态)gydF4y2Ba%层状态参数。gydF4y2BaHiddenState CellStategydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Balayer = peepholeLSTMLayer(numHiddenUnits,inputSize,args)gydF4y2Ba%PEEPHOLELSTMLAYER PEEPHOLELSTMLAYER % Layer = PEEPHOLELSTMLAYER (numHiddenUnits) %创建一个具有指定数量%隐藏单元的peepholelstm层。% % layer = peepholeLSTMLayer(numHiddenUnits,Name=Value) %创建一个窥视孔LSTM层,并使用一个或多个Name - Value参数指定额外的%选项:% % Name -层的名称,以字符串形式指定。%默认为“”。% % OutputMode -输出模式,指定为以下%之一:% "sequence" -输出数据的整个序列%。% % "last" -输出数据的最后一个时间步长%。%默认为“sequence”。gydF4y2Ba解析输入参数。gydF4y2Ba参数gydF4y2BanumHiddenUnits输入大小参数。Name =gydF4y2Ba”“gydF4y2Ba;arg游戏。OutputMode =gydF4y2Ba“序列”gydF4y2Ba;gydF4y2Ba结束gydF4y2Ba层。NumHiddenUnits = numHiddenUnits; layer.Name = args.Name; layer.OutputMode = args.OutputMode;%设置图层描述。gydF4y2Ba层。描述=gydF4y2Ba“窥视孔LSTM与”gydF4y2BanumHiddenUnits +gydF4y2Ba“隐藏单位”gydF4y2Ba;gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba图层=初始化(图层,布局)gydF4y2Ba% layer = initialize(layer,layout)初始化图层gydF4y2Ba%可学习参数和状态参数。gydF4y2Ba%gydF4y2Ba%的输入:gydF4y2Ba% layer -初始化的层。gydF4y2Ba% layout -数据布局,指定为gydF4y2Ba% networkDataLayout对象。gydF4y2Ba%gydF4y2Ba%输出:gydF4y2Ba% layer -初始化图层。gydF4y2BanumHiddenUnits = layer.NumHiddenUnits;gydF4y2Ba%查找频道数。gydF4y2BaIdx = finddim(布局,gydF4y2Ba“C”gydF4y2Ba);numChannels = layout.Size(idx);gydF4y2Ba初始化输入权重。gydF4y2Ba如果gydF4y2Baisempty(layer.InputWeights) sz = [4*numHiddenUnits numChannels];numOut = 4*numHiddenUnits;numIn = numChannels;层。InputWeights = initializeGlorot(sz,numOut,numIn);gydF4y2Ba结束gydF4y2Ba初始化循环权值。gydF4y2Ba如果gydF4y2Baisempty(layer.RecurrentWeights) sz = [4*numHiddenUnits];层。RecurrentWeights = initializeOrthogonal(sz);结束gydF4y2Ba初始化窥视孔权重。gydF4y2Ba如果gydF4y2Baisempty(layer.PeepholeWeights) sz = [3*numHiddenUnits 1];numOut = 3*numHiddenUnits;numIn = 1;层。PeepholeWeights = initializeGlorot(sz,numOut,numIn);gydF4y2Ba结束gydF4y2Ba%初始化偏差。gydF4y2Ba如果gydF4y2Baisempty (layer.Bias)层。偏见=initializeUnitForgetGate(numHiddenUnits);gydF4y2Ba结束gydF4y2Ba%初始化隐藏状态。gydF4y2Ba如果gydF4y2Baisempty (layer.HiddenState)层。HiddenState=0(numHiddenUnits,1);gydF4y2Ba结束gydF4y2Ba%初始化单元格状态。gydF4y2Ba如果gydF4y2Baisempty (layer.CellState)层。CellState=0(numHiddenUnits,1);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[Z,cellState,hiddenState] = predict(layer,X)gydF4y2Ba%PREDICT Peephole LSTM PREDICT function % [Z,hiddenState,cellState] = PREDICT (layer,X) forward %通过层传播数据X,并返回%层输出Z和更新的隐藏状态和单元状态。X %是格式为“CBT”的数组,Z是格式为“CB”或“CBT”的数组,具体取决于层的OutputMode %属性。gydF4y2Ba%初始化序列输出。gydF4y2BanumHiddenUnits = layer.NumHiddenUnits;miniBatchSize = size(X),finddim(X),gydF4y2Ba“B”gydF4y2Ba));numTimeSteps = size(X),finddim(X),gydF4y2Ba“T”gydF4y2Ba));gydF4y2Ba如果gydF4y2Ba层。OutputMode = =gydF4y2Ba“序列”gydF4y2BaZ = 0 (numHiddenUnits,miniBatchSize,numTimeSteps,gydF4y2Ba“喜欢”gydF4y2Ba, X);Z = darray (Z,gydF4y2Ba“认知行为治疗”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba%计算WX + b。gydF4y2BaX = stripdims(X);WX = pagemtimes(layer.InputWeights,X) + layer.Bias;gydF4y2Ba%连接的权重数组的索引。gydF4y2Baidx1 = 1:numHiddenUnits;idx2 = 1+numHiddenUnits:2*numHiddenUnits;idx3 = 1+2*numHiddenUnits:3*numHiddenUnits;idx4 = 1+3*numHiddenUnits:4*numHiddenUnits;gydF4y2Ba%初始状态。gydF4y2BahiddenState = layer.HiddenState;cellState = layer.CellState;gydF4y2Ba%随时间步长循环。gydF4y2Ba为gydF4y2Bat = 1:numTimeStepsgydF4y2Ba%计算R*h_{t-1}。gydF4y2BaRht =层。RecurrentWeights * hiddenState;%计算p*c_{t-1}。gydF4y2Bapict = layer.PeepholeWeights(idx1) .* cellState;pfct = layer.PeepholeWeights(idx2) .* cellState;gydF4y2Ba%门计算。gydF4y2Ba它= sigmoid(WX(idx1,:,t) + Rht(idx1,:) + pict);ft = sigmoid(WX(idx2,:,t) + Rht(idx2,:) + pfct);gt = tanh(WX(idx3,:,t) + Rht(idx3,:));gydF4y2Ba%使用更新的单元格状态计算。gydF4y2BacellState = gt .* it + cellState .* ft;poct = layer.PeepholeWeights(idx3) .* cellState;t = s (WX(idx4,:,t) + rt (idx4,:) + c);gydF4y2Ba%更新隐藏状态。gydF4y2BahiddenState = tanh(cellState) .* ot;gydF4y2Ba%更新序列输出。gydF4y2Ba如果gydF4y2Ba层。OutputMode = =gydF4y2Ba“序列”gydF4y2BaZ(:,:,t) = hiddenState;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba%上次输出的时间步长。gydF4y2Ba如果gydF4y2Ba层。OutputMode = =gydF4y2Ba“最后一次”gydF4y2BaZ = darray (hiddenState;gydF4y2Ba“CB”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba函数gydF4y2Balayer = resetState(layer)gydF4y2Ba%RESETSTATE重置层状态% layer = RESETSTATE (layer)重置%层的状态属性。gydF4y2BanumHiddenUnits = layer.NumHiddenUnits;层。HiddenState = 0 (numHiddenUnits,1);层。CellState = 0 (numHiddenUnits,1);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

GPU的兼容性gydF4y2Ba

如果层转发功能完全支持万博1manbetxgydF4y2BadlarraygydF4y2Ba对象,则该层是GPU兼容的。否则,为了与GPU兼容,层函数必须支持类型的输入和返回输出万博1manbetxgydF4y2BagpuArraygydF4y2Ba(并行计算工具箱)gydF4y2Ba.gydF4y2Ba

许多MATLAB内置函数支持万博1manbetxgydF4y2BagpuArraygydF4y2Ba(并行计算工具箱)gydF4y2Ba和gydF4y2BadlarraygydF4y2Ba输入参数。的函数列表万博1manbetxgydF4y2BadlarraygydF4y2Ba对象,看到gydF4y2Ba支持数组的函数列表万博1manbetxgydF4y2Ba.有关在GPU上执行的函数列表,请参见gydF4y2Ba在GPU上运行MATLAB函数gydF4y2Ba(并行计算工具箱)gydF4y2Ba.gydF4y2Ba要使用GPU进行深度学习,还必须有支持GPU的设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxgydF4y2BaGPU计算要求gydF4y2Ba(并行计算工具箱)gydF4y2Ba.gydF4y2Ba有关在MATLAB中使用gpu的更多信息,请参见gydF4y2BaMATLAB中的GPU计算gydF4y2Ba(并行计算工具箱)gydF4y2Ba.gydF4y2Ba

在本例中,使用了MATLAB中的函数gydF4y2Ba预测gydF4y2Ba所有的支万博1manbetx持gydF4y2BadlarraygydF4y2Ba对象,因此该层是GPU兼容的。gydF4y2Ba

在网络中包含自定义层gydF4y2Ba

您可以像使用Deep Learning Toolbox中的任何其他层一样使用自定义层。使用前面创建的窥视孔LSTM层创建并训练用于序列分类的网络。gydF4y2Ba

加载示例训练数据。gydF4y2Ba

[XTrain,TTrain] = japevowelstraindata;gydF4y2Ba

定义网络架构。创建一个包含窥视孔LSTM层的层数组。gydF4y2Ba

inputSize = 12;numHiddenUnits = 100;numClasses = 9;layers = [sequenceInputLayer(inputSize)] peepholeLSTMLayer(numHiddenUnits,OutputMode=gydF4y2Ba“最后一次”gydF4y2Ba) fulllyconnectedlayer (numClasses) softmaxLayer classificationLayer];gydF4y2Ba

指定训练选项并训练网络。以27个小批大小进行训练,并左填充数据。gydF4y2Ba

options = trainingOptions(gydF4y2Ba“亚当”gydF4y2BaSequencePaddingDirection MiniBatchSize = 27日=gydF4y2Ba“左”gydF4y2Ba);net = trainNetwork(XTrain,TTrain,layers,options);gydF4y2Ba
单CPU训练。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |丧失准确性  | |========================================================================================| | 1 | 1 |就是3.70% | | 2.2060 | 0.0010 | | 5 | 50 | 00:00:17 | 92.59% | 0.5917 | 0.0010 | | 100 | | 00:00:26 | 92.59% | 0.2182 | 0.0010 | | 150 | | 00:00:36 | 100.00% | 0.0588 |0.0010 | | 200 | | 00:00:46 | 96.30% | 0.0919 | 0.0010 | | 25 | 250 | 00:00:57 | 100.00% | 0.0384 | 0.0010 | | 300 | | 00:01:08 | | 0.0164 | 0.0010 100.00%  | |========================================================================================| 培训完成:马克思时代完成。gydF4y2Ba

通过预测新数据和计算准确率来评估网络性能。gydF4y2Ba

[XTest,TTest] = japanese evowelstestdata;YTest = class (net,XTest,MiniBatchSize=27);准确度=平均值(YTest==TTest)gydF4y2Ba
精度= 0.8676gydF4y2Ba

参考文献gydF4y2Ba

[1] Greff, Klaus, Rupesh K. Srivastava, Jan Koutník, Bas R. Steunebrink和j rgen Schmidhuber。“LSTM:搜索太空漫游。”gydF4y2BaIEEE神经网络与学习系统汇刊gydF4y2Ba28日,没有。10(2016): 2222-2232。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba