nn.LSTM(input_dim,hidden_dim,nums_layer,batch_first)
各參數理解:
- input_dim:輸入的張量維度,表示自變量特征數
- hidden_dim:輸出張量維度
- bias:True or False 是否使用偏置
- batch_first:True or False,nn.LSTM 接收的輸入是(seq_len,batch_size,input_dim),將batch_first設置為True將輸入變為(batch_size,seq_len,input_dim)
- dropout:除了最后層外都引入隨機失活
- bidirectional:True or False 是否使用雙向LSTM
舉例:10000個句子,每個句子10個詞,batch_size=10,embedding_size=300(input_dim)
此時各個參數為:
- input_size=embedding_size=300
- batch=batch_size=10
- seq_len=10
- 另外設置hidden_dim=128,num_layers=2
import torch
import torch.nn as nn
from torch.autograd import Variable
rnn = nn.LSTM(input_size=300,hidden_size=128,num_layers=2)
inputs = torch.randn(10,10,300)#輸入(seq_len, batch_size, input_size) 序列長度為10 batch_size為10 輸入維度為300
h_0 = torch.randn(2,10,128)#(num_layers * num_directions, batch, hidden_size) num_layers = 2 ,batch_size=10 ,hidden_size = 128,如果LSTM的bidirectional=True,num_directions=2,否則就是1,表示只有一個方
c_0 = torch.randn(2,10,128)#c_0和h_0的形狀相同,它包含的是在當前這個batch_size中的每個句子的初始細胞狀態。h_0,c_0如果不提供,那么默認是0
num_directions=1# 因為是單向LSTM
#輸出格式為(output,(h_n,c_n))
output,(h_n,c_n) = rnn(inputs,(h0,c0))#輸入格式為lstm(input,(h_0, c_0))
print("out:", output.shape)
print("h_n:", h_n.shape)
print("c_n:", c_n.shape)
輸出結果:
out: torch.Size([10, 10, 128])
h_n: torch.Size([2, 10, 128])
c_n: torch.Size([2, 10, 128])
輸出結果:
- output的shape為(seq_len=5,batch_size=3,num_directions*hidden_size),hidden_size為20,num_directions為1。它包含的LSTM的最后一層的輸出特征(h_t),t是batch_size中每個句子的長度。
- h_n.shape為(num_directions*num_layers=2,batch_size=3,hidden_size=20)
- c_n.shape==h_n.shape
- h_n是句子最后一個單詞的隱藏狀態,c_n包含句子最后一個單詞的細胞狀態,它們與句子長度無關
- LSTM中的隱藏狀態就是輸出。