精度学习torch.nn.lstm

参考资料:
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,:]

你可能感兴趣的:(精度学习torch.nn.lstm)