参考资料:
PyTorch 中的 LSTM模型参数解释
torch.nn.LSTM()函数维度详解
简书中Markdown使用攻略
LSTM中state 与 output关系
RNN 的 output 和 state 的区别
用torch.nn模块搭建的模型是一个layer,用torch.nn.function模块搭建的模型是函数。
先看一下torch.nn.lstm(input_size,hidden_size,num_layers,bias,batch_first,dropout,bidirectional)
input_size==embedding_size
hidden_size,lstm模型参数维度
num_layers,有几层LSTM
bias: 隐层状态是否带bias,默认为true。bias是偏置值,或者偏移值。没有偏置值就是以0为中轴,或以0为起点。偏置值的作用请参考单层感知器相关结构。
batch_first: 输入输出的第一维是否为 batch_size,默认值 False。因为 Torch 中,人们习惯使用Torch中带有的dataset,dataloader向神经网络模型连续输入数据,这里面就有一个 batch_size 的参数,表示一次输入多少个数据。 在 LSTM 模型中,输入数据必须是一批数据,为了区分LSTM中的批量数据和dataloader中的批量数据是否相同意义,LSTM 模型就通过这个参数的设定来区分。 如果是相同意义的,就设置为True,如果不同意义的,设置为False。 torch.LSTM 中 batch_size 维度默认是放在第二维度,故此参数设置可以将 batch_size 放在第一维度。如:input 默认是(4,1,5),中间的 1 是 batch_size,指定batch_first=True后就是(1,4,5)。所以,如果你的输入数据是二维数据的话,就应该将 batch_first 设置为True;
dropout: 默认值0。是否在除最后一个 RNN 层外的其他 RNN 层后面加 dropout 层。输入值是 0-1 之间的小数,表示概率。0表示0概率dripout,即不dropout
bidirectional: 是否是双向 RNN,默认为:false,若为 true,则:num_directions=2,否则为1。 我的理解是,LSTM 可以根据数据输入从左向右推导结果。然后再用结果从右到左反推导,看原因和结果之间是否可逆。也就是原因和结果是一对一关系,还是多对一的关系。这仅仅是我肤浅的假设,有待证明。
代码块
import torch
import torch.nn as nn
lstm = nn.LSTM(10, 20, 2)
x = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
c0 = torch.randn(2, 3, 20)
output, (hn, cn)=lstm(x, (h0, c0))
>>
output.shape torch.Size([5, 3, 20])
hn.shape torch.Size([2, 3, 20])
cn.shape torch.Size([2, 3, 20])
lstm=nn.LSTM(input_size, hidden_size, num_layers)
1 | 2 | 3 | 4 |
---|---|---|---|
x | seq_len | batch_size | input_size |
h0 | num_layers×num_directions | batch_size | hidden_size |
c0 | num_layers ×num_directions | batch_size | hidden_size |
output | seq_len | batch_size | num_layers× num_directions ×hidden_size |
hn | num_layers ×num_directions | batch_size | hidden_size |
cn | num_layers ×num_directions | batch_size | hidden_size |
cn是内部cell产生的向量,hn是根据cell和output gate产生的一个输出向量,hn也是取自每句话的最后时刻的输出,所以hn=output[:,-1,:]