nn.LSTM的参数理解

输入参数:

input_size 输入数据的特征维数,通常就是embedding_dim(词向量的维度)
hidden_size LSTM中隐层的维度num_layers 循环神经网络的层数bias 用不用偏置,default=True
batch_first 这个要注意,通常我们输入的数据shape=(batch_size,seq_length,embedding_dim),而batch_first默认是False,所以我们的输入数据最好送进LSTM之前将batch_size与seq_length这两个维度调换
那为什么不直接batch first=True?这是为了便于并行计算。
因为cuDNN中RNN的API就是batch_size在第二维度!进一步,为啥cuDNN要这么做呢?因为batch first意味着模型的输入(一个Tensor)在内存中存储时,先存储第一个sequence,再存储第二个… 而如果是seq_len first,模型的输入在内存中,先存储所有序列的第一个单元,然后是第二个单元… 两种区别如下图所示:
nn.LSTM的参数理解_第1张图片

dropout 默认是0,代表不用dropout
bidirectional默认是false,代表不用双向LSTM

输入数据包括input,(h_0,c_0):

input就是shape=(seq_length,batch_size,input_size)的张量
h_0是shape=(num_layers*num_directions,batch_size,hidden_size)的张量,它包含了在当前这个batch_size中每个句子的初始隐藏状态。其中num_layers就是LSTM的层数。如果bidirectional=True,num_directions=2,否则就是1,表示只有一个方向。c_0和h_0的形状相同,它包含的是在当前这个batch_size中的每个句子的初始细胞状态。h_0,c_0如果不提供,那么默认是0。

输出数据包括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中一直隐藏的,记录着信息
————————————————
原文链接:https://blog.csdn.net/m0_45478865/article/details/104455978

你可能感兴趣的:(笔记,lstm,rnn,深度学习)