主要内容

lstm

长短期记忆

说明

长短期记忆 (LSTM) 运算允许网络学习时间序列和序列数据中时间步之间的长期相关性。

注意

此函数将深度学习 LSTM 运算应用于 dlarray 数据。如果要在 dlnetwork 对象中应用 LSTM 运算,请使用 lstmLayer

Y = lstm(X,H0,C0,weights,recurrentWeights,bias) 使用初始隐藏状态 H0、初始单元状态 C0 以及参数 weightsrecurrentWeightsbias 对输入 X 应用长短期记忆 (LSTM) 计算。输入 X 必须是格式化的 dlarray。输出 Y 是格式化的 dlarray,其维度格式与 X 相同,但不包含任何 "S" 维度。

lstm 函数使用双曲正切函数 (tanh) 作为状态激活函数来更新单元状态和隐藏状态。lstm 函数使用 σ(x)=(1+ex)1 给出的 sigmoid 函数作为门激活函数。

示例

[Y,hiddenState,cellState] = lstm(X,H0,C0,weights,recurrentWeights,bias) 还返回 LSTM 运算后的隐藏状态和单元状态。

___ = lstm(___,Name=Value) 使用一个或多个名称-值参量指定其他选项。

示例

全部折叠

使用三个隐藏单元执行 LSTM 运算。

将输入序列数据创建为 32 个观测值,具有 10 个通道,序列长度为 64

numFeatures = 10;
numObservations = 32;
sequenceLength = 64;

X = randn(numFeatures,numObservations,sequenceLength);
X = dlarray(X,"CBT");

使用三个隐藏单元创建初始隐藏状态和单元状态。对所有观测值使用相同的初始隐藏状态和单元状态。

numHiddenUnits = 3;
H0 = zeros(numHiddenUnits,1);
C0 = zeros(numHiddenUnits,1);

为 LSTM 运算创建可学习参数。

weights = dlarray(randn(4*numHiddenUnits,numFeatures),"CU");
recurrentWeights = dlarray(randn(4*numHiddenUnits,numHiddenUnits),"CU");
bias = dlarray(randn(4*numHiddenUnits,1),"C");

执行 LSTM 计算

[Y,hiddenState,cellState] = lstm(X,H0,C0,weights,recurrentWeights,bias);

查看输出的大小和维度。

size(Y)
ans = 1×3

     3    32    64

dims(Y)
ans = 
'CBT'

查看隐藏状态和单元状态的大小。

size(hiddenState)
ans = 1×2

     3    32

size(cellState)
ans = 1×2

     3    32

输入参数

全部折叠

输入数据,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。当 X 不是格式化的 dlarray 时,必须使用 DataFormat 选项指定维度标签格式。如果 X 是数值数组,则 H0C0weightsrecurrentWeightsbias 中至少有一个必须是 dlarray

X 必须包含一个标记为 "T" 的序列维度。如果 X 具有任何标签为 "S" 的空间维度,则它们将展平为 "C" 通道维度。如果 X 没有通道维度,则会添加一个。如果 X 具有任何标签为 "U" 的未指定维度,则它们必须是单一维度。

初始隐藏状态向量,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

如果 H0 是格式化的 dlarray,它必须包含标签为 "C" 的通道维度,并且可以选择性地包含一个标签为 "B" 的批量维度(其大小与 X"B" 维度相同)。如果 H0 没有 "B" 维度,则该函数对 X 中的每个观测值使用相同的隐藏状态向量。

"C" 维度的大小决定了隐藏单元的数量。H0"C" 维度大小必须等于 C0"C" 维度大小。

如果 H0 不是格式化的 dlarray,则第一个维度的大小决定了隐藏单元的数量,并且必须与 C0 的第一个维度或 "C" 维度大小相同。

初始单元状态向量,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

如果 C0 是格式化的 dlarray,它必须包含标签为 'C' 的通道维度,并且可以选择性地包含一个标签为 'B' 的批量维度(其大小与 X'B' 维度相同)。如果 C0 没有 'B' 维度,则该函数对 X 中的每个观测值使用相同的单元状态向量。

'C' 维度的大小决定了隐藏单元的数量。C0'C' 维度大小必须等于 H0'C' 维度大小。

如果 C0 不是格式化的 dlarray,则第一个维度的大小决定了隐藏单元的数量,并且必须与 H0 的第一个维度或 'C' 维度大小相同。

权重,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

weights 指定为一个大小为 4*NumHiddenUnits×InputSize 的矩阵,其中 NumHiddenUnitsC0H0"C" 维度的大小,InputSizeX"C" 维度的大小乘以 X 的每个 "S" 维度(如果存在)的大小。

如果 weights 是格式化的 dlarray,则它必须包含一个大小为 4*NumHiddenUnits"C" 维度和一个大小为 InputSize"U" 维度。

循环权重,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

recurrentWeights 指定为一个大小为 4*NumHiddenUnits×NumHiddenUnits 的矩阵,其中 NumHiddenUnitsC0H0"C" 维度的大小。

如果 recurrentWeights 是格式化的 dlarray,则它必须包含一个大小为 4*NumHiddenUnits"C" 维度和一个大小为 NumHiddenUnits"U" 维度。

偏置,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

bias 指定为长度为 4*NumHiddenUnits 的向量,其中 NumHiddenUnitsC0H0"C" 维度的大小。

如果 bias 是格式化的 dlarray,则非单一维度的标签必须为 "C"

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: Y = lstm(X,H0,C0,weights,recurrentWeights,bias,DataFormat="CTB") 应用 LSTM 运算并指定数据格式为 "CTB"(通道、时间、批量)。

数据维度的描述,指定为字符向量或字符串标量。

数据格式是一个字符串,其中每个字符描述对应数据的维度的类型。

这些字符是:

  • "S" - 空间

  • "C" - 通道

  • "B" - 批量

  • "T" - 时间

  • "U" - 未指定

例如,假设有一个表示一批序列的数组,其中第一个、第二个和第三个维度分别对应于通道、观测值和时间步。您可以将该数据描述为具有格式 "CBT"(通道、批量、时间)。

您可以指定多个标注为 "S""U" 的维度。每个 "C""B""T" 标签最多可以使用一次。该软件忽略第二个维度后的单一尾部 "U" 维度。

如果输入数据不是格式化的 dlarray 对象,则必须指定 DataFormat 选项。

有关详细信息,请参阅Deep Learning Data Formats

数据类型: char | string

自 R2024a 起

用于更新单元状态和隐藏状态的激活函数,指定为下列值之一:

  • "tanh" - 使用双曲正切函数 (tanh)。

  • "softsign" - 使用 softsign 函数 softsign(x)=x1+|x|

  • "relu" - 使用修正线性单元 (ReLU) 函数 ReLU(x)={x,x>00,x0

软件在计算中使用此选项作为 σc 函数来更新单元状态和隐藏状态。

有关详细信息,请参阅 lstmLayer 参考页上Long Short-Term Memory Layer的定义。

自 R2024a 起

应用于门的激活函数,指定为下列值之一:

  • "sigmoid" - 使用 sigmoid 函数 σ(x)=(1+ex)1

  • "hard-sigmoid" - 使用硬 sigmoid 函数

    σ(x)={00.2x+0.51if x<2.5if2.5x2.5if x>2.5.

软件在层门计算中使用此选项作为 σg 函数。

有关详细信息,请参阅 lstmLayer 参考页上Long Short-Term Memory Layer的定义。

输出参量

全部折叠

LSTM 输出,以 dlarray 形式返回。输出 Y 与输入 X 具有相同的基础数据类型。

如果输入数据 X 是格式化的 dlarray,则 YX 具有相同的维度格式,但不包含任何 "S" 维度。如果输入数据不是格式化的 dlarray,则 Y 是未格式化的 dlarray,其维度顺序与输入数据相同。

Y"C" 维度大小与隐藏单元的数量相同,由 H0C0"C" 维度大小指定。

每个观测值的隐藏状态向量,以 dlarray 或数值数组(与 H0 具有相同的数据类型)的形式返回。

如果输入 H0 是格式化的 dlarray,则输出 hiddenState 是格式化的 dlarray,格式为 "CB"

每个观测值的单元状态向量,以 dlarray 或数值数组的形式返回。返回的 cellState 具有与 C0 相同的数据类型。

如果输入 C0 是格式化的 dlarray,则输出 cellState 以格式化的 dlarray 形式返回,格式为 'CB'

算法

全部折叠

扩展功能

全部展开

版本历史记录

在 R2019b 中推出

全部展开