表示一个可训练的循环层,接受一个向量序列,产生一个由大小为 n 的向量组成的序列.
LongShortTermMemoryLayer[n,opts]
包含权重和其他参数的选项.
LongShortTermMemoryLayer
表示一个可训练的循环层,接受一个向量序列,产生一个由大小为 n 的向量组成的序列.
LongShortTermMemoryLayer[n,opts]
包含权重和其他参数的选项.
更多信息和选项
- LongShortTermMemoryLayer[n] 表示一个网络,接受表示向量序列的输入矩阵并输出同样长度的序列.
- 输入序列的每个元素是一个大小为 k 的向量,输出序列的每个元素是一个大小为 n 的向量.
- 在 NetGraph、NetChain 等中, 输入向量的大小 k 通常自动由推断而得.
- LongShortTermMemoryLayer[n] 所表示的网络的输入端口和输出端口为:
-
"Input" 大小为 k 的向量组成的序列 "Output" 大小为 n 的向量组成的序列 - 给定一个输入序列 {x1,x2,…,xT},LSTM 使用以下递推关系输出一个状态序列 {s1,s2,…,sT},其中
默认为 Tanh: -
输入门 (input gate) it=LogisticSigmoid[Wix.xt+Wis.st-1+bi] 输出门 (output gate) ot=LogisticSigmoid[Wox.xt+Wos.st-1+bo] 遗忘门 (forget gate) ft=LogisticSigmoid[Wfx.xt+Wfs.st-1+bf] 记忆门 (memory gate) 
单元状态 (cell state) 
状态 (state) 
- LongShortTermMemoryLayer[n] 有下列状态端口:
-
"State" 大小为 n 的向量 "CellState" 大小为 n 的向量 - 在 NetGraph 中,可以使用形式为 src->NetPort[layer,"state"] 的连接提供 LongShortTermMemoryLayer 的 "State" 或 "CellState" 的初始值,对应于循环关系式中的 s0 和 c0. 缺省的初始值为零向量.
- NetStateObject 可以用来创建一个网络,该网络将记住当网络应用于输入时 LongShortTermMemoryLayer 的状态更新后的值.
- 在 NetGraph 中,可以使用形式为 NetPort[layer,"state"]->dst 的连接获取 LongShortTermMemoryLayer 的 "State" 或 "CellState" 的终值,它对应于循环关系中的 sT 和 cT.
- 在大小为 k 的向量上操作的初始化过的 LongShortTermMemoryLayer[…] 含有下列可训练的数组:
-
"InputGateInputWeights" Wix 大小为 n×k 的矩阵 "InputGateStateWeights" Wis 大小为 n×n 的矩阵 "InputGateBiases" bi 大小为 n 的向量 "OutputGateInputWeights" Wox 大小为 n×k 的矩阵 "OutputGateStateWeights" Wos 大小为 n×n 的矩阵 "OutputGateBiases" bo 大小为 n 的向量 "ForgetGateInputWeights" Wfx 大小为 n×k 的矩阵 "ForgetGateStateWeights" Wfs 大小为 n×n 的矩阵 "ForgetGateBiases" bf 大小为 n 的向量 "MemoryGateInputWeights" Wmx 大小为 n×k 的矩阵 "MemoryGateStateWeights" Wms 大小为 n×n 的矩阵 "MemoryGateBiases" bm 大小为 n 的向量 - 在 LongShortTermMemoryLayer[n,opts] 中,可以用格式为 "array"->value 的规则把初始值赋予可训练数组.
- 可包括以下可选参数:
-
"Activation" "Tanh" 应用的激活函数,以获得记忆门和最终状态输出 "Dropout" None dropout 规则,其中,根据概率将单元设为零 LearningRateMultipliers Automatic 可训练数组的学习率乘子 - 参数 "Activation" 可被设为 "Tanh" 或 "ReLU".
- 指定 "Dropout"->None 将禁止在训练时进行 dropout.
- 指定 "Dropout"->p 将以 dropout 概率 p 应用自动选择的 dropout 方法.
- 指定 "Dropout"->{"method1"->p1,"method2"->p2,…} 可用来按相应的 dropout 概率组合不同的 dropout 方法. 可能的方法包括:
-
"VariationalWeights" dropout 应用于权重矩阵间的循环连接(默认) "VariationalInput" 对来自输入的门贡献 (gate contribution) 应用 dropout,在序列中的每一步使用同样模式的单元 "VariationalState" 对来自前面状态的门贡献 (gate contribution) 应用 dropout,在序列中的每一步使用同样模式的单元 "StateUpdate" 在加到前面的状态之前,对状态更新向量应用 dropout,在序列中的每一步使用不同模式的单元 - dropout 方法 "VariationalInput" 和 "VariationalState" 是基于 Gal et al. 2016 方法,其中, "StateUpdate" 是基于 Semeniuta et al. 2016 方法,"VariationalWeights" 是基于 Merity et al. 2017 方法.
- LongShortTermMemoryLayer[n,"Input"->shape] 允许指定输入的形状. shape 的可能的形式为:
-
NetEncoder[…] 生成向量序列的编码器 {len,k} 由 len 个长度为 k 的向量组成的序列 {len,Automatic} 由 len 个向量组成的序列,其中向量的长度由推断而得 {"Varying",k} 不同数量的向量,每个向量的长度为 k {"Varying",Automatic} 不同数量的向量,每个向量的长度由推断而得 - 当 NumericArray 作为输入时,输出将是 NumericArray.
- Options[LongShortTermMemoryLayer] 给出构建网络层的默认选项列表. Options[LongShortTermMemoryLayer[…]] 给出在某些数据上运行网络层的默认选项列表.
- Information[LongShortTermMemoryLayer[…]] 给出关于网络层的报告.
- Information[LongShortTermMemoryLayer[…],prop] 给出 LongShortTermMemoryLayer[…] 的属性 prop 的值. 可能的属性与 NetGraph 相同.
范例
打开所有单元 关闭所有单元基本范例 (2)
创建一个 LongShortTermMemoryLayer,产生由长度为 3 的向量组成的序列:
LongShortTermMemoryLayer[3]创建一个随机初始化的 LongShortTermMemoryLayer,接受由长度为 2 的向量组成的序列,产生由长度为 3 的向量组成的序列:
lstm = NetInitialize@LongShortTermMemoryLayer[3, "Input" -> {"Varying", 2}]lstm[{{1, 2}, {0, 1}, {2, 1}, {1, 2}}]//MatrixForm范围 (5)
创建一个随机初始化的 LongShortTermMemoryLayer,接受一个字符串, 产生由长度为 2 的向量组成的序列:
lstm =
NetInitialize@LongShortTermMemoryLayer[2, "Input" -> NetEncoder[{"Characters", Automatic, "UnitVector"}]]lstm["hello world"]//MatrixFormlstm[{"good", "bye"}]//Map[MatrixForm]创建一个随机初始化的网络,接受由长度为 2 的向量组成的序列,产生一个长度为 3 的向量:
net = NetInitialize@NetChain[{
LongShortTermMemoryLayer[3, "Input" -> {"Varying", 2}],
SequenceLastLayer[]
}]net[{{1, 2}, {2, 1}, {3, 0}}]net[{{{1, 2}, {2, 1}, {3, 0}}, {{3, 3}, {0, 0}}}]创建一个 LongShortTermMemoryLayer,用 Ramp ("ReLU") 函数生成记忆门和最终状态输出:
LongShortTermMemoryLayer[3, "Activation" -> "ReLU"]创建一个 NetGraph,允许设置 LongShortTermMemoryLayer 初始状态和单元状态 (cell state):
graph = NetInitialize@NetGraph[
{LongShortTermMemoryLayer[2, "Input" -> {"Varying", 2}]},
{NetPort["InitialState"] -> NetPort[1, "State"], NetPort["InitialCellState"] -> NetPort[1, "CellState"]}]graph[<|"Input" -> {{1, 2}, {2, 0}, {3, 1}}, "InitialState" -> {1, 1}, "InitialCellState" -> {0, 1}|>]创建一个 NetGraph,允许获取 LongShortTermMemoryLayer 的终态和单元状态:
graph = NetInitialize@NetGraph[
{LongShortTermMemoryLayer[2, "Input" -> {"Varying", 2}]},
{NetPort[1, "State"] -> NetPort["FinalState"], NetPort[1, "CellState"] -> NetPort["FinalCellState"]}]graph[{{1, 2}, {2, 0}, {3, 1}}]%[["FinalState"]] == %[["Output", -1]]选项 (2)
"Dropout" (2)
创建一个 LongShortTermMemoryLayer,同时指定 dropout 方法:
LongShortTermMemoryLayer[2, "Dropout" -> {"VariationalInput" -> 0.1, "VariationalState" -> 0.1}]创建一个随机初始化的、具有指定 dropout 概率的 LongShortTermMemoryLayer :
lstm = NetInitialize@LongShortTermMemoryLayer[2, "Dropout" -> 0.5, "Input" -> {"Varying", 2}]data = {{1, 2}, {3, 4}, {1, 0}, {2, 2}};
lstm[data]//MatrixFormlstm2 = NetReplacePart[lstm, "Dropout" -> 0];
lstm[data] == lstm2[data]用 NetEvaluationMode 来强制 dropout 的训练行为:
lstm[data, NetEvaluationMode -> "Train"]//MatrixFormTable[lstm[{{1, 2}, {3, 4}, {5, 6}, {7, 8}}, NetEvaluationMode -> "Train"], 5]//Map[MatrixPlot[#, ImageSize -> 30, FrameTicks -> None]&]应用 (2)
产生训练数据,由描述两位数相加及其相应数值结果的字符串组成:
enc = NetEncoder[{"Characters", {DigitCharacter, "+"}}];
makeRule[a_, b_] := IntegerString[a] <> "+" <> IntegerString[b] -> a + b;
trainingData = Flatten@Table[makeRule[i, j], {i, 0, 99}, {j, 0, 99}];
RandomSample[trainingData, 4]//InputForm创建一个网络,使用堆叠的 LongShortTermMemoryLayer 读取输入字符串并预测数值结果:
net = NetChain[{UnitVectorLayer[], LongShortTermMemoryLayer[40], LongShortTermMemoryLayer[20], SequenceLastLayer[], LinearLayer[1]}, "Input" -> enc, "Output" -> "Scalar"];trained = NetTrain[net, trainingData, BatchSize -> 64, MaxTrainingRounds -> 200, ValidationSet -> Scaled[0.1]]Round@trained[{"5+2", "10+25", "9+11", "44+44"}]基于含有 x 和 y 的字符串创建训练数据,通过比较 x 和 y 的数量得出 Less、Greater 或 Equal. 训练数据由最长为 8 的所有可能的字符串组成:
alphabet = {"x", "y", " "};
inputs = Flatten@Table[StringJoin /@ Tuples[alphabet, n], {n, 1, 8}];
cmpXY[str_] := Switch[Sign[StringCount[str, "x"] - StringCount[str, "y"]], -1, Less, 0, Equal, 1, Greater];
outputs = cmpXY /@ inputs;
trainingData = Thread[inputs -> outputs];
RandomSample[trainingData, 4]//InputForm创建含有 LongShortTermMemoryLayer 的网络,读入一个字符串,预测是 Less、Greater 还是 Equal:
net = NetChain[{UnitVectorLayer[], LongShortTermMemoryLayer[5], SequenceLastLayer[], LinearLayer[3], SoftmaxLayer[]}, "Input" -> NetEncoder[{"Characters", alphabet}], "Output" -> NetDecoder[{"Class", {Less, Equal, Greater}}]];trained = NetTrain[net, trainingData, BatchSize -> 64, MaxTrainingRounds -> 100, ValidationSet -> Scaled[0.2]]trained[{"xxy", "xyy", "xyxy"}]NetMeasurements[trained, trainingData, "Accuracy"]属性和关系 (1)
NetStateObject 可用来创建一个能记住 LongShortTermMemoryLayer 的状态的网络:
sobj = NetStateObject[NetInitialize@LongShortTermMemoryLayer[2, "Input" -> {"Varying", 2}]]每次计算都将改变储存在 NetStateObject 中的状态:
sobj[{{0, 0}, {1, 1}}]sobj[{{0, 0}, {1, 1}}]sobj[{{0, 0}, {1, 1}}]技术笔记
文本
Wolfram Research (2017),LongShortTermMemoryLayer,Wolfram 语言函数,https://reference.wolfram.com/language/ref/LongShortTermMemoryLayer.html (更新于 2026 年).
CMS
Wolfram 语言. 2017. "LongShortTermMemoryLayer." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2026. https://reference.wolfram.com/language/ref/LongShortTermMemoryLayer.html.
APA
Wolfram 语言. (2017). LongShortTermMemoryLayer. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/LongShortTermMemoryLayer.html 年
BibTeX
@misc{reference.wolfram_2026_longshorttermmemorylayer, author="Wolfram Research", title="{LongShortTermMemoryLayer}", year="2026", howpublished="\url{https://reference.wolfram.com/language/ref/LongShortTermMemoryLayer.html}", note=[Accessed: 02-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_longshorttermmemorylayer, organization={Wolfram Research}, title={LongShortTermMemoryLayer}, year={2026}, url={https://reference.wolfram.com/language/ref/LongShortTermMemoryLayer.html}, note=[Accessed: 02-November-2026]}