RNN结构:
在这里插入图片描述

对应的代码为:(代码中没写偏置)
在这里插入图片描述

在这里插入图片描述
上图是单层LSTM的输入输出结构图。其实它是由一个LSTM单元的一个展开,如下图所示:
在这里插入图片描述
所以从左到右的每个LSTM Block只是对应一个时序中的不同的步。
在第一个图中,输入的时序特征有S个,长度记作:seq_len,每个特征是一个C维的向量,长度记作:input_size。而Initial State是LSTM的隐藏状态和内部状态的一个输入的初始化。分别记作:h0和c0。
输出可以通过设置,来决定是输出所有时序步的输出,还是只输出最后一个时序步的输出。Final_State是隐藏状态和内部状态的输出,记作:hn和cn.

那么对于在pytorch中的函数LSTM的参数的输入情况如下:

输入数据:
  • X的格式:(seq_len,batch,input_size)
    #batch是批次数,可以在LSTM()中设置batch_first,使得X的输入格式要求变为(batch,seq_len,input_size)
  • h0的格式:(1,batch,hidden_size)
  • c0的格式:(1,batch,hidden_size)
    因为不管输入的数据X是多少个特征的,h0和c0的都只需要一个输入就行。

对于输出,输出的hidden_size的大小是由门控中的隐藏的神经元的个数来确定的。

输出的格式:
  • H的格式:(seq_len,batch,hidden_size)
    #如果按照(seq_len,batch,hidden_size) 的格式输出,需要在LSTM()中设置return_sequences=True,否则默认只输出最后一个时间步的输出结果(1,batch,hidden_size).
  • hn的格式:(1,batch,hidden_size)
  • cn的格式:(1,batch,hidden_size)

这只是LSTM单元的输入输出格式,真实的其后还要跟一个全连接层,用于把LSTM的输出结果映射到自己想要的结果上,如分类:
在这里插入图片描述
如果只想要研究最后一个时间步的输出结果,只需在最后一个时间步添加全连接即可。

多层LSTM的输入与输出

在这里插入图片描述
对于多层的LSTM,需要把第一层的每个时间步的输出作为第二层的时间步的输入,如上图所示。
对于num_layers层LSTM:

输入数据:
  • X的格式:(seq_len,batch,input_size)
  • h0的格式:(num_layers,batch,hidden_size)
  • c0的格式:(num_layers,batch,hidden_size)
输出数据:
  • H的格式:(seq_len,batch,hidden_size)
  • hn的格式:(num_layers,batch,hidden_size)
  • cn的格式:(num_layers,batch,hidden_size)

如果是双向的,即在LSTM()函数中,添加关键字bidirectional=True,则:
单向则num_direction=1,双向则num_direction=2
输入数据格式:
input(seq_len, batch, input_size)
h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
输出数据格式:
output(seq_len, batch, hidden_size * num_directions)
hn(num_layers * num_directions, batch, hidden_size)
cn(num_layers * num_directions, batch, hidden_size)

补充细节,下面是转载的:
版权声明:本文为CSDN博主「ssswill」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/ssswill/article/details/88429794
在这里插入图片描述
输出的y=act(h_t*W_y)+b_y(图中未显示!)

可以看到中间的 cell 里面有四个黄色小框,你如果理解了那个代表的含义一切就明白了,每一个小黄框代表一个前馈网络层,对,就是经典的神经网络的结构,num_units就是这个层的隐藏神经元个数,就这么简单。其中1、2、4的激活函数是 sigmoid,第三个的激活函数是 tanh。
另外几个需要注意的地方:
1、 cell 的状态是一个向量,是有多个值的。
2、 上一次的状态 h(t-1)是怎么和下一次的输入 x(t) 结合(concat)起来的,这也是很多资料没有明白讲的地方,也很简单,concat, 直白的说就是把二者直接拼起来,比如 x是28位的向量,h(t-1)是128位的,那么拼起来就是156位的向量。
3、 cell 的权重是共享的,这是什么意思呢?这是指这张图片上有三个绿色的大框,代表三个 cell 对吧,但是实际上,它只是代表了一个 cell 在不同时序时候的状态,所有的数据只会通过一个 cell,然后不断更新它的权重。
4、那么一层的 LSTM 的参数有多少个?根据第 3 点的说明,我们知道参数的数量是由 cell 的数量决定的,这里只有一个 cell,所以参数的数量就是这个 cell 里面用到的参数个数。假设 num_units 是128,输入是28位的,那么根据上面的第 2 点,可以得到,四个小黄框的参数一共有 (128+28)*(128*4),也就是156 * 512,可以看看 TensorFlow 的最简单的 LSTM 的案例,中间层的参数就是这样,不过还要加上输出的时候的激活函数的参数,假设是10个类的话,就是128*10的 W 参数和10个bias 参数
5、cell 最上面的一条线的状态即 s(t) 代表了长时记忆,而下面的 h(t)则代表了工作记忆或短时记忆。

LSTM的训练过程:
在这里插入图片描述
在这里插入图片描述
说明:上面画红框的地方,如想输出如上的三维矩阵,需要指明参数:return_sequences=True
在这里插入图片描述
再附一张图:
在这里插入图片描述
白色框框中,第一行是实现细节,第二行是第一行输出结果的维度。
对于双向的Bi-LSTM网络:

在这里插入图片描述
正向求得的第一个正h_1和反向求得的最后一个反h_-1,生成的结果进行对应位置相加,然后再经过act(W_y*h)+b_y得到对应的y.

如何堆叠 多层 LSTM 网络——长短期记忆( LSTM )系列_ LSTM 的建模方法(2)发布时间:2018-12-07 15:15,浏览次数:1362, 标签: LSTM 导读:堆叠式 LSTM 属于深度学习,通过添加网络的深度,提高训练的效率,获得更高的准确性。文中介绍了堆叠式 LSTM 的架构和实现方法在堆叠式 LSTM 中,层与层的输数出通过return_sequences = True参数修改成3D数据,以便供下... 4.batch_first:默认为False,在制作数据集和数据集载入的时候,有个参数叫batch_size,也就是一次 输入 几个数据, lstm 输入 默认将batch_size放在第二维,当为True的时候,则将batch_size放在第一维。1.input_size: 输入 的特征维度,一般来说就是字向量的维度,比如如果用bert(base)的话,那么 输入 的维度input_size=768。3.num_layers:很好理解,就是 LSTM 堆叠的层数,默认值为1,设置为2的时候,第一层的 输出 是第二层的 输入 。 首先明确一点, RNN 单元的 输入 输出 的维度,点击参考keras.layers. RNN ()文档 输入 尺寸 3D 张量,尺寸为 (batch_size, timesteps, input_dim)。 输出 尺寸 如果 return_state:返回张量列表。 第一个张量为 输出 。剩余的张量为最后的状态, 每个张量的尺寸为 (batch_size, units)。 如果 return_sequences:返回 3D 张量, 尺寸为 (batch_size, timesteps, units)。 否则,返回尺寸为 (b   读这篇文章的时候,默认你已经对 LSTM 神经网络有了一个初步的认识,当你深入理解时,可能会对 多层 LSTM 内部的隐藏节点数,有关cell的定义或者每一层的 输入 输出 是什么样子的特别好奇,虽然神经网络就像是一个黑箱子一样,但是我们仍然试图去理解他们。  我们所说的 LSTM 的cell就是这样子的一个结构:(图中标识的A就是一个cell,图中一共是三个cell)   其中的X.t代表t时刻的 输入 ,h.t代... RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。 因此,如果你正在尝试处理一段文本进行预测, RNN 可能从一开始就会遗漏重要信息。 在反向传播期间, RNN 会面临梯度消失的问题。 梯度是用于更新神经网络的权重值,消失的梯度问题是当梯度随着时间的推移传播时梯度下降,如果梯度值变得非常小,就不会继续学习。 欢迎转载,但请务必注明原文出处及作者信息。@author: huangyongye @creat_date: 2017-03-09 前言: 根据我本人学习 TensorFlow 实现 LSTM 的经历,发现网上虽然也有不少教程,其中很多都是根据官方给出的例子,用 多层 LSTM 来实现 PTBModel 语言模型,比如: tensorflow笔记: 多层 LSTM 代码分析 但是感觉这些例子还 LSTM 总共有7个参数:前面3个是必须 输入 的 1:input_size: 输入 特征维数,即每一行 输入 元素的个数。 输入 是一维向量。如:[1,2,3,4,5,6,7,8,9],input_size 就是9 2:hidden_size: 隐藏层状态的维数,即隐藏层节点的个数,这个和 单层 感知器的结构是类似的。这个维数值是自定义的,根据具体业务需要决定,如下图: input_... input_size 输入 特征维数:(特征向量的长度,如2048) hidden_size 隐层状态的维数:(每个 LSTM 单元或者时间步的 输出 的ht的维度,单元内部有权重与偏差计算) num_layers RNN 层的个数:(在竖直... 对于 输入 文本序列,在 LSTM 的每个时间步 输入 序列中一个单词的嵌入表示,计算当前时间步的隐藏状态,用于当前时间步的 输出 以及传递给下一个时间步和下一 个单词的词向量一起作为 LSTM 单元 输入 ,然后再计算下一个时间步的 LSTM 隐藏状态,以此重复... 堆叠 LSTM 使模型深度更深,提取的特征更深层次,从而使预测更准确。堆叠 LSTM 在大范围的预测问题上取得了不错的效果。 The success of deep neural networks is commonly attributed to the h from  博客  在 rnn 中存在梯度消失和梯度爆炸的问题。          梯度爆炸解决办法: 上图          梯度爆炸解决办法:引入 lstm 一、 LSTM (Long-Short Term memory)的结构                    二、计算值说明            ft:forget gate            it: input gate           ...