LSTM結構中是一個神經網絡,即上圖的結構就是一個LSTM單元,裏面的每個黃框是一個神經網絡,這個網絡的隱藏單元個數我們設爲hidden_size,那麼這個LSTM單元裏就有4*hidden_size個參數。每個LSTM輸出的都是向量,包括 ,它們的長度都是當前LSTM單元的hidden_size
函數
class torch.nn.LSTM(*args, **kwargs)
參數列表
- input_size:x的特徵維度
- hidden_size:隱藏層的特徵維度
- num_layers:lstm隱層的層數,默認爲1
- bias:False則bih=0和bhh=0. 默認爲True
- batch_first:True則輸入輸出的數據格式爲 (batch, seq, feature)
- dropout:除最後一層,每一層的輸出都進行dropout,默認爲: 0
- bidirectional:True則爲雙向lstm默認爲False
輸入:input, (h0, c0)
輸出:output, (hn,cn)
是第一個LSTM cell的隱藏層狀態。是最後一個LSTM cell的隱藏層狀態。
輸入數據格式:
input(seq_len, batch, input_size)
h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
這裏解釋一下爲什麼輸入數據的格式是。比如第一個LSTM,輸入的是個句子的第一個單詞,第二個LSTM輸入是個句子的第二個單詞,依次類推。總共有seq_len個LSTM,所以輸入的結構是
再解釋一下的維度,先解釋最後一維,由於是LSTM的內部參數,所以第三維是hidden_isze,總共有batch個句子,每個句子都有一個,所以第二維是batch,總共有num_layers層LSTM,每一層都有一個初始狀態,如果是雙向LSTM,則有兩個,所以第一維是num_layers * num_directions。的維度同理。
輸出數據格式:
output(seq_len, batch, hidden_size * num_directions)
hn(num_layers * num_directions, batch, hidden_size)
cn(num_layers * num_directions, batch, hidden_size)
num_directions指的是單向(值爲1)還是雙向(值爲2)。
import torch
import torch.nn as nn
from torch.autograd import Variable
# 構建網絡模型---輸入矩陣特徵數input_size、輸出矩陣特徵數hidden_size、層數num_layers
rnn = nn.LSTM(10,20,2) # (input_size,hidden_size,num_layers)
inputs = torch.randn(5,3,10) # (seq_len,batch_size,input_size)
h0 = torch.randn(2,3,20) # (num_layers* 1,batch_size,hidden_size)
c0 = torch.randn(2,3,20) # (num_layers*1,batch_size,hidden_size)
num_directions=1 # 因爲是單向LSTM
output,(hn,cn) = rnn(inputs,(h0,c0)) # (h0,c0)也可以用none來代替,使系統來初始化
print(output.size())
print(hn.size())
print(cn.size())
'''輸出
torch.Size([5, 3, 20])
torch.Size([2, 3, 20])
torch.Size([2, 3, 20])
'''
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;
nn.GRU()與nn.LSTM類似,不再贅述。