評價此頁

RNN#

class 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)[source]#

對輸入序列應用一個多層 Elman RNN,具有 tanh\tanhReLU\text{ReLU} 非線性。對於輸入序列的每個元素,每一層都計算以下函式:

ht=tanh(xtWihT+bih+ht1WhhT+bhh)h_t = \tanh(x_t W_{ih}^T + b_{ih} + h_{t-1}W_{hh}^T + b_{hh})

其中 hth_t 是時間 t 的隱藏狀態,xtx_t 是時間 t 的輸入,而 h(t1)h_{(t-1)} 是上一層在 t-1 時刻的隱藏狀態,或者是 0 時刻的初始隱藏狀態。如果 nonlinearity'relu',則使用 ReLU\text{ReLU} 代替 tanh\tanh

# Efficient implementation equivalent to the following with bidirectional=False
rnn = nn.RNN(input_size, hidden_size, num_layers)
params = dict(rnn.named_parameters())
def forward(x, hx=None, batch_first=False):
    if batch_first:
        x = x.transpose(0, 1)
    seq_len, batch_size, _ = x.size()
    if hx is None:
        hx = torch.zeros(rnn.num_layers, batch_size, rnn.hidden_size)
    h_t_minus_1 = hx.clone()
    h_t = hx.clone()
    output = []
    for t in range(seq_len):
        for layer in range(rnn.num_layers):
            input_t = x[t] if layer == 0 else h_t[layer - 1]
            h_t[layer] = torch.tanh(
                input_t @ params[f"weight_ih_l{layer}"].T
                + h_t_minus_1[layer] @ params[f"weight_hh_l{layer}"].T
                + params[f"bias_hh_l{layer}"]
                + params[f"bias_ih_l{layer}"]
            )
        output.append(h_t[-1].clone())
        h_t_minus_1 = h_t.clone()
    output = torch.stack(output)
    if batch_first:
        output = output.transpose(0, 1)
    return output, h_t
引數
  • input_size – 輸入 x 中預期特徵的數量

  • hidden_size – 隱藏狀態 h 中的特徵數量

  • num_layers – 迴圈層數。例如,設定 num_layers=2 將意味著將兩個 RNN 堆疊在一起形成一個 堆疊 RNN,第二個 RNN 接收第一個 RNN 的輸出並計算最終結果。預設為:1

  • nonlinearity – 使用的非線性函式。可以是 'tanh''relu'。預設為:'tanh'

  • bias – 如果為 False,則該層不使用偏置權重 b_ihb_hh。預設值:True

  • batch_first – 如果為 True,則輸入和輸出張量以 (batch, seq, feature) 的形式提供,而不是 (seq, batch, feature)。請注意,這不適用於隱藏狀態或單元狀態。有關詳細資訊,請參閱下方的輸入/輸出部分。預設值:False

  • dropout – 如果非零,則在除最後一層外的每個 RNN 層的輸出上引入 Dropout 層,其 dropout 機率等於 dropout。預設為:0

  • bidirectional – 如果為 True,則成為雙向 RNN。預設為:False

輸入:input, hx
  • input: 未批處理輸入的張量,形狀為 (L,Hin)(L, H_{in}),批處理輸入的張量,形狀為 (L,N,Hin)(L, N, H_{in})batch_first=False 時,或形狀為 (N,L,Hin)(N, L, H_{in})batch_first=True 時。包含輸入序列的特徵。輸入也可以是打包的可變長度序列。有關詳細資訊,請參閱 torch.nn.utils.rnn.pack_padded_sequence()torch.nn.utils.rnn.pack_sequence()

  • hx: 未批處理輸入的初始隱藏狀態張量,形狀為 (Dnum_layers,Hout)(D * \text{num\_layers}, H_{out}),批處理輸入的初始隱藏狀態張量,形狀為 (Dnum_layers,N,Hout)(D * \text{num\_layers}, N, H_{out})。如果未提供,則預設為零。

其中

N=batch sizeL=sequence lengthD=2 if bidirectional=True otherwise 1Hin=input_sizeHout=hidden_size\begin{aligned} N ={} & \text{batch size} \\ L ={} & \text{sequence length} \\ D ={} & 2 \text{ if bidirectional=True otherwise } 1 \\ H_{in} ={} & \text{input\_size} \\ H_{out} ={} & \text{hidden\_size} \end{aligned}
輸出:output, h_n
  • output: 未批處理輸入的輸出張量,形狀為 (L,DHout)(L, D * H_{out}),批處理輸入的輸出張量,形狀為 (L,N,DHout)(L, N, D * H_{out})batch_first=False 時,或形狀為 (N,L,DHout)(N, L, D * H_{out})batch_first=True 時。包含 RNN 最後一層對於每個 t 的輸出特徵 (h_t)。如果輸入是 torch.nn.utils.rnn.PackedSequence,輸出也將是打包序列。

  • h_n: 未批處理輸入的最終隱藏狀態張量,形狀為 (Dnum_layers,Hout)(D * \text{num\_layers}, H_{out}),批處理輸入的最終隱藏狀態張量,形狀為 (Dnum_layers,N,Hout)(D * \text{num\_layers}, N, H_{out})。包含批次中每個元素的最終隱藏狀態。

變數
  • weight_ih_l[k] – 第 k 層的可學習輸入-隱藏權重,k = 0 時形狀為 (hidden_size, input_size)。否則,形狀為 (hidden_size, num_directions * hidden_size)

  • weight_hh_l[k] – 第 k 層的可學習隱藏-隱藏權重,形狀為 (hidden_size, hidden_size)

  • bias_ih_l[k] – 第 k 層的可學習輸入-隱藏偏置,形狀為 (hidden_size)

  • bias_hh_l[k] – 第 k 層的可學習隱藏-隱藏偏置,形狀為 (hidden_size)

注意

所有權重和偏置都從 U(k,k)\mathcal{U}(-\sqrt{k}, \sqrt{k}) 處初始化,其中 k=1hidden_sizek = \frac{1}{\text{hidden\_size}}

注意

對於雙向 RNN,前向和後向分別是方向 0 和 1。當 batch_first=False 時,拆分輸出層的示例:output.view(seq_len, batch, num_directions, hidden_size)

注意

對於未批處理的輸入,batch_first 引數被忽略。

警告

在某些版本的cuDNN和CUDA上,RNN函式存在已知的非確定性問題。您可以透過設定以下環境變數來強制執行確定性行為

在CUDA 10.1上,設定環境變數 CUDA_LAUNCH_BLOCKING=1。這可能會影響效能。

在 CUDA 10.2 或更高版本中,請設定環境變數(請注意開頭的冒號符號) CUBLAS_WORKSPACE_CONFIG=:16:8CUBLAS_WORKSPACE_CONFIG=:4096:2

更多資訊請參閱cuDNN 8發行說明

注意

如果滿足以下條件:1) 啟用了 cudnn,2) 輸入資料在 GPU 上 3) 輸入資料的 dtype 為 torch.float16 4) 使用 V100 GPU,5) 輸入資料不是 PackedSequence 格式,則可以選擇持久化演算法來提高效能。

示例

>>> rnn = nn.RNN(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> output, hn = rnn(input, h0)
forward(input: Tensor, hx: Optional[Tensor] = None) tuple[torch.Tensor, torch.Tensor][source]#
forward(input: PackedSequence, hx: Optional[Tensor] = None) tuple[torch.nn.utils.rnn.PackedSequence, torch.Tensor]

執行前向傳播。