pytorch nn.LSTM(),nn.GRU()參數詳解

在這裏插入圖片描述
LSTM結構中是一個神經網絡,即上圖的結構就是一個LSTM單元,裏面的每個黃框是一個神經網絡,這個網絡的隱藏單元個數我們設爲hidden_size,那麼這個LSTM單元裏就有4*hidden_size個參數。每個LSTM輸出的都是向量,包括CthtC_t和h_t ,它們的長度都是當前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)
    h0C0h_0和C_0是第一個LSTM cell的隱藏層狀態。hnCnh_n和C_n是最後一個LSTM cell的隱藏層狀態。

輸入數據格式:

input(seq_len, batch, input_size)
h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)

這裏解釋一下爲什麼輸入數據的格式是[seqlen,batch,inputsize][seqlen, batch, inputsize]。比如第一個LSTM,輸入的是batchbatch個句子的第一個單詞,第二個LSTM輸入是batchbatch個句子的第二個單詞,依次類推。總共有seq_len個LSTM,所以輸入的結構是[seqlen,batch,inputsize][seqlen, batch, inputsize]

再解釋一下h0h_0的維度,先解釋最後一維,由於h0h_0是LSTM的內部參數,所以第三維是hidden_isze,總共有batch個句子,每個句子都有一個h0h_0,所以第二維是batch,總共有num_layers層LSTM,每一層都有一個初始狀態h0h_0,如果是雙向LSTM,則有兩個h0h0,所以第一維是num_layers * num_directions。c0c_0的維度同理。
輸出數據格式:

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類似,不再贅述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章