GRU¶
- class torch.nn.GRU(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, device=None, dtype=None)[原始碼][原始碼]¶
將多層閘控循環單元 (GRU) RNN 應用於輸入序列。對於輸入序列中的每個元素,每一層計算以下函數
其中 是時間 t 的隱藏狀態, 是時間 t 的輸入, 是時間 t-1 時該層的隱藏狀態,或是時間 0 時的初始隱藏狀態,而 、、 分別是重置閘、更新閘和新閘。 是 sigmoid 函數,而 是 Hadamard 乘積。
在多層 GRU 中,第 層 () 的輸入是前一層的隱藏狀態 乘以 dropout 。其中每個 都是一個 Bernoulli 隨機變數,有 的機率為
dropout
。- 參數
input_size – 輸入 x 中預期特徵的數量。
hidden_size – 隱藏狀態 h 中特徵的數量。
num_layers – 遞迴層的數量。 例如,設定
num_layers=2
表示將兩個 GRU 堆疊在一起以形成一個 堆疊 GRU,第二個 GRU 接收第一個 GRU 的輸出並計算最終結果。 預設值:1bias – 如果
False
,則該層不使用偏差權重 b_ih 和 b_hh。 預設值:True
batch_first – 如果
True
,則輸入和輸出張量以 (batch, seq, feature) 而不是 (seq, batch, feature) 的形式提供。 請注意,這不適用於隱藏或儲存格狀態。 有關詳細資訊,請參閱下面的「輸入/輸出」部分。 預設值:False
dropout – 如果非零,則在每個 GRU 層(最後一層除外)的輸出上引入一個 Dropout 層,dropout 機率等於
dropout
。 預設值:0bidirectional – 如果
True
,則成為雙向 GRU。 預設值:False
- 輸入: input, h_0
input: 形狀為 的張量,用於非批次輸入;當
batch_first=False
時,形狀為 ,當batch_first=True
時,形狀為 ,其中包含輸入序列的特徵。輸入也可以是 packed variable length sequence。詳情請參閱torch.nn.utils.rnn.pack_padded_sequence()
或torch.nn.utils.rnn.pack_sequence()
。h_0: 形狀為 或 的張量,包含輸入序列的初始隱藏狀態。如果未提供,則默認為零。
其中
- 輸出: output, h_n
輸出:形狀為 的張量 (tensor),適用於未分批輸入 (unbatched input);當
batch_first=False
時,形狀為 ;當batch_first=True
時,形狀為 。包含 GRU 最後一層的輸出特徵 (h_t),對應於每個 t。如果輸入是torch.nn.utils.rnn.PackedSequence
,則輸出也會是一個 packed sequence。h_n:形狀為 或 的張量 (tensor),包含輸入序列的最終隱藏狀態。
- 變數
weight_ih_l[k] – 第 層的 input-hidden 可學習權重 (W_ir|W_iz|W_in),當 k = 0 時,形狀為 (3*hidden_size, input_size)。否則,形狀為 (3*hidden_size, num_directions * hidden_size)。
weight_hh_l[k] – 第 層的 hidden-hidden 可學習權重 (W_hr|W_hz|W_hn),形狀為 (3*hidden_size, hidden_size)。
bias_ih_l[k] – 第 層的 input-hidden 可學習偏差 (b_ir|b_iz|b_in),形狀為 (3*hidden_size)。
bias_hh_l[k] – 第 層的 hidden-hidden 可學習偏差 (b_hr|b_hz|b_hn),形狀為 (3*hidden_size)。
注意
所有權重和偏差都從 的均勻分佈中初始化,其中 。
注意
對於雙向 GRU,正向和反向分別是方向 0 和 1。當
batch_first=False
時,分割輸出層的範例:output.view(seq_len, batch, num_directions, hidden_size)
。注意
對於未批次處理的輸入,將忽略
batch_first
參數。注意
新閘 (new gate) 的計算方式與原始論文和其他框架略有不同。在原始實作中, 和先前隱藏狀態 (previous hidden state) 之間的 Hadamard 乘積 是在與權重矩陣 W 相乘並加上偏差 (bias) 之前完成的。
這與 PyTorch 的實作方式不同,PyTorch 是在 後完成。
此實作方式是為了效率而刻意設計的。
注意
如果滿足以下條件:1) 啟用 cudnn,2) 輸入資料位於 GPU 上,3) 輸入資料的 dtype 為
torch.float16
,4) 使用 V100 GPU,5) 輸入資料不是PackedSequence
格式,則可以選擇持續性演算法來提高效能。範例
>>> rnn = nn.GRU(10, 20, 2) >>> input = torch.randn(5, 3, 10) >>> h0 = torch.randn(2, 3, 20) >>> output, hn = rnn(input, h0)