詳解pytorch中循環神經網絡(RNN、LSTM、GRU)的維度
- RNN
- torch.nn.rnn詳解
- RNN輸入輸出維度
- LSTM
- torch.nn.LSTM詳解
- LSTM輸入輸出維度
- GRU
- torch.nn.GRU詳解
- GRU輸入輸出維度
- 三種RNN的示例
首先如果你對RNN、LSTM、GRU不太熟悉,可點擊查看。
RNN
torch.nn.rnn詳解
torch.nn.RNN(input_size,
hidden_size,
num_layers=1,
nonlinearity=‘tanh’,
bias=True,
batch_first=False,
dropout=0.0,
bidirectional=False,
device=None,
dtype=None)
原理:
參數詳解:
-
input_size – 輸入x中預期特征的數量
-
hidden_size – 隱藏狀態h中的特征數量
-
num_layers – 循環層數。例如,設置num_layers=2 意味著將兩個LSTM堆疊在一起形成堆疊 LSTM,第二個 LSTM 接收第一個 LSTM 的輸出并計算最終結果。默認值:1
-
nonlinearity– 使用的非線性。可以是’tanh’或’relu’。默認:‘tanh’
-
bias– 如果False,則該層不使用偏差權重b_ih和b_hh。默認:True
-
batch_first – 如果,則輸入和輸出張量以(batch, seq, feature)True形式提供,而不是(seq, batch, feature)。請注意,這不適用于隱藏狀態或單元狀態。默認:False
-
dropout – 如果非零,則在除最后一層之外的每個LSTM層的輸出上 引入Dropout層,dropout 概率等于 。默認值:0.0
-
bidirectional – 如果True, 則成為雙向LSTM。默認:False
RNN輸入輸出維度
rnn = nn.RNN(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = rnn(input, h0)
可以看到輸入是x
和h_0
,h_0
可以是None。如果batch_size是第0維度,需設置batch_first=True
。
輸出則是output
和h_n
。h_n存了每一層的t時刻的隱藏狀態值
# Efficient implementation equivalent to the following with bidirectional=False
def forward(x, h_0=None):if batch_first:x = x.transpose(0, 1)seq_len, batch_size, _ = x.size()if h_0 is None:h_0 = torch.zeros(num_layers, batch_size, hidden_size)...return output, h_n
輸入:
x的輸入維度:(batch_size, sequence_length, input_size) [前提:batch_first=True]
h_0的維度:(D?num_layers, hidden_size) [可以為None]
輸出: output的輸出維度:(batch_size, sequence_length, D*hidden_size)
[D=2 if bidirectional=True otherwise 1]
h_n的維度:(D?num_layers, hidden_size)
LSTM
torch.nn.LSTM詳解
torch.nn.LSTM(input_size,
hidden_size,
num_layers=1,
bias=True,
batch_first=False,
dropout=0.0,
bidirectional=False,
proj_size=0,
device=None,
dtype=None)
原理:
參數詳解:
相比于RNN多了proj_size
參數,少了nonlinearity
參數
-
input_size – 輸入x中預期特征的數量
-
hidden_size – 隱藏狀態h中的特征數量
-
num_layers – 循環層數。例如,設置num_layers=2 意味著將兩個LSTM堆疊在一起形成堆疊 LSTM,第二個 LSTM 接收第一個 LSTM 的輸出并計算最終結果。默認值:1
-
bias– 如果False,則該層不使用偏差權重b_ih和b_hh。默認:True
-
batch_first – 如果,則輸入和輸出張量以(batch, seq, feature)True形式提供,而不是(seq, batch, feature)。請注意,這不適用于隱藏狀態或單元狀態。默認:False
-
dropout – 如果非零,則在除最后一層之外的每個LSTM層的輸出上 引入Dropout層,dropout 概率等于 。默認值:0dropout
-
bidirectional – 如果True, 則成為雙向LSTM。默認:False
-
proj_size – 如果,將使用具有相應大小投影的LSTM 。默認值:0
LSTM輸入輸出維度
LSTM= nn.LSTM(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
c0 = torch.randn(2, 3, 20)
output, (hn, cn) = LSTM(input, (h0, c0))
輸入是x
,此外h_0
和c_0
可以是None。如果batch_size是第0維度,需設置batch_first=True
。
輸出則是output
和一個元組(h_n, c_n)
。
輸入: x的輸入維度:(batch_size, sequence_length, input_size)`
[前提:batch_first=True]
輸出: output的輸出維度:(batch_size, sequence_length, D*hidden_size)
[D=2 if bidirectional=True otherwise 1]
具體可參考官方文檔:nn.LSTM
GRU
torch.nn.GRU詳解
torch.nn.GRU(input_size,
hidden_size,
num_layers=1,
bias=True,
batch_first=False,
dropout=0.0,
bidirectional=False,
device=None,
dtype=None)
原理:
參數詳解:
與上文LSTM相比,缺少了proj_size
參數,與RNN相比也缺少了nonlinearity
參數
GRU輸入輸出維度
gru= nn.GRU(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = gru(input, h0)
與RNN一致見上文,相比LSTM少了c_n
三種RNN的示例
import torch
import torch.nn as nnrnn = nn.RNN(10, 20, 2, batch_first=True) # (input_size, hidden_size, num_layer)
lstm = nn.LSTM(10, 20, 2, batch_first=True)
gru = nn.GRU(10, 20, 2, batch_first=True)input = torch.randn(5, 3, 10) # (batchsize, seq, input_size)
h0 = torch.randn(2, 3, 20)
c0 = torch.randn(2, 3, 20)output_rnn, h_n = rnn(input)
output_lstm, (hn, cn) = lstm(input)
output_gru, h_n2 = gru(input)
print("輸入維度:", input.shape)
print(f"RNN 輸出維度:{output_rnn.shape}, h_n維度:{h_n.shape}" )
print("LSTM 輸出維度:", output_lstm.shape)
print("GRU 輸出維度:", output_gru.shape)"""
輸入維度: torch.Size([5, 3, 10])
RNN 輸出維度:torch.Size([5, 3, 20]), h_n維度:torch.Size([2, 5, 20])
LSTM 輸出維度: torch.Size([5, 3, 20])
GRU 輸出維度: torch.Size([5, 3, 20])
"""