LSTM的输入、输出介绍

LSTM输入输出说明
输入数据包括input,(h_0,c_0):
  1. input就是shape==(seq_length,batch_size,input_size)的张量
  2. h_0的shape==(num_layers×num_directions,batch,hidden_size)的张量,它包含了在当前这个batch_size中每个句子的初始隐藏状态,num_layers就是LSTM的层数,如果
  3. bidirectional=True,num_directions=2,否则就是1,表示只有一个方向,
  4. c_0和h_0的形状相同,它包含的是在当前这个batch_size中的每个句子的初始细胞状态。
    h_0,c_0如果不提供,那么默认是0
  5. batch_first=True, 就是让batch在输入和输出放在最前面的维度
输出数据包括output,(h_n,c_n):`
  • output的shape==(seq_length,batch_size,num_directions×hidden_size),它包含的LSTM的最后一层的输出特征(h_t),t是batch_size中每个句子的长度.
  • h_n是包含了所有层的信息。shape==(num_directions × num_layers,batch,hidden_size)
    c_n.shape==h_n.shape
  • h_n包含的是句子的最后一个单词的隐藏状态,c_n包含的是句子的最后一个单词的细胞状态,所以它们都与句子的长度seq_length无关。
  • output[-1]与h_n是相等的,因为output[-1]包含的正是batch_size个句子中每一个句子的最后一个单词的隐藏状态,注意LSTM中的隐藏状态其实就是输出,cell
    state细胞状态才是LSTM中一直隐藏的,记录着信息。

自我解读

  • output是最后一层的输出,并且包含了句子每个token的输出,因此可用于字符级别的处理。
  • h n 和 c n h_n和c_n hncn的是包含了所有层的输出,他的第一维就是他的层数(direction*num_layers),然后第二维才是batch,第三维是代表整体的embeding维度,它相当于是一个句子级别的考量。
torch.nn.LSTM(*args, kwargs)**
参数
– input_size
– hidden_size
– num_layers
– bias
– batch_first
– dropout
– bidirectional
 
LSTM的输入 input, (h_0, c_0)
– input (seq_len, batch, input_size)
– h_0 (num_layers * num_directions, batch, hidden_size) # 初始的隐藏状态
– c_0 (num_layers * num_directions, batch, hidden_size) # 初始的单元状态,维度与h_0相同
 
LSTM的输出 output, (h_n, c_n)
– output (seq_len, batch, num_directions * hidden_size)#output保存了最后一层,每个time step的输出h
– h_n (num_layers * num_directions, batch, hidden_size) # 最后时刻的输出隐藏状态
– c_n (num_layers * num_directions, batch, hidden_size) # 最后时刻的输出单元状态,维度与h_n相同
先上结论:
1. output保存了最后一层,每个time step的输出h,如果是双向LSTM,每个time step的输出
   h = [h正向, h逆向] (同一个time step的正向和逆向的h连接起来)。
2. h_n保存了每一层,最后一个time step的输出h,如果是双向LSTM,单独保存前向和后向的
   最后一个time step的输出h。
3. c_n与h_n一致,只是它保存的是c的值。
 
下面单独分析三个输出
1. output是一个三维的张量,第一维表示序列长度,第二维表示一批的样本数(batch),
   第三维是 hidden_size(隐藏层大小) * num_directions , 代码中可以发现num_directions
   根据是“否为双向”取值为1或2
 
2. h_n是一个三维的张量,第一维是num_layers*num_directions,num_layers是我们定义的
 神经网络的层数,num_directions在上面介绍过,取值为1或2,表示是否为双向LSTM。第二维表示
 batch_size 第三维表示隐藏层的大小。
 
 举个例子,我们定义一个num_layers=3的双向LSTM,h_n第一个维度的大小就等于 6 (2*3),h_n[0]
表示第一层前向传播最后一个time step的输出,h_n[1]表示第一层后向传播最后一个time step的输出,
h_n[2]表示第二层前向传播最后一个time step的输出,h_n[3]表示第二层后向传播最后一个time step的输出,
h_n[4]和h_n[5]分别表示第三层前向和后向传播时最后一个time step的输出。
 
3. c_n与h_n的结构一样

LSTM参考链接:https://blog.youkuaiyun.com/qq_16792139/article/details/118356220

### LSTM输入输出机制 LSTM(长短期记忆网络)是一种特殊的循环神经网络架构,旨在解决传统RNN中的梯度消失问题。通过引入三个门控机制——输入门、遗忘门以及输出门,使得模型能够更有效地处理长时间依赖关系。 #### PyTorch 中的 LSTM 输入输出 在PyTorch框架下,LSTM层接收的数据形状通常遵循(batch_size, seq_len, input_size),其中`batch_size`代表批次大小;`seq_len`指序列长度即时间步数;而`input_size`则对应特征数量或者说是每一时刻输入向量的维度[^2]。 对于输出而言,LSTM会返回两个主要部分: - `(output, (hn, cn))` - `output`: 形状为`(seq_len, batch, hidden_size * num_directions)`,包含了最后一个时间步的所有隐藏状态。 - `(hn,cn)`: 这是一个元组,分别存储着最终的时间步下的隐含状态(`hn`)和细胞状态(`cn`),它们都具有尺寸`(num_layers * num_directions,batch,hidden_size)`。 #### TensorFlow 中的状态管理 而在TensorFlow中,当涉及到双向动态RNN时,则使用了特定的对象来保存这些中间计算结果—`LSTMStateTuple`。它由两部分组成:一个是cell state (`c`)另一个是hidden state (`h`)。这两个组件共同决定了下一个时间点上的初始条件,并且在整个训练过程中不断更新以反映当前的学习进度[^3]。 ```python import tensorflow as tf from tensorflow.keras.layers import LSTMCell # 创建一个单层LSTM单元 lstm_cell = LSTMCell(units=10) # 初始化零状态 initial_state = lstm_cell.get_initial_state(batch_size=8, dtype=tf.float32) print(f'Initial State Shape: {tf.shape(initial_state)}') ``` 上述代码展示了如何创建并初始化一个基于Keras API构建的LSTM单元及其起始状态。 ### 实现方式总结 无论是采用PyTorch还是TensorFlow平台开发含有LSTM结构的应用程序,理解其核心概念如输入格式、内部运作原理及输出形式都是非常重要的前提条件之一。这不仅有助于编写正确的前馈逻辑,而且也利于后续调试工作顺利开展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值