當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python PyTorch LSTM用法及代碼示例


本文簡要介紹python語言中 torch.nn.LSTM 的用法。

用法:

class torch.nn.LSTM(*args, **kwargs)

參數

  • input_size-輸入x中的預期特征數

  • hidden_size-隱藏狀態的特征數h

  • num_layers-循環層數。例如,設置 num_layers=2 意味著將兩個 LSTM 堆疊在一起以形成 stacked LSTM ,第二個 LSTM 接收第一個 LSTM 的輸出並計算最終結果。默認值:1

  • bias-如果 False ,則該層不使用偏置權重 b_ihb_hh 。默認值:True

  • batch_first-如果 True ,則輸入和輸出張量提供為 (batch, seq, feature) 而不是 (seq, batch, feature) 。請注意,這不適用於隱藏或單元狀態。有關詳細信息,請參閱下麵的輸入/輸出部分。默認值:False

  • dropout-如果非零,則在除最後一層之外的每個 LSTM 層的輸出上引入 Dropout 層,丟棄概率等於 dropout 。默認值:0

  • bidirectional-如果 True ,則成為雙向 LSTM。默認值:False

  • proj_size-如果 > 0 ,將使用具有相應大小的投影的 LSTM。默認值:0

變量

  • ~LSTM.weight_ih_l[k]- (W_ii|W_if|W_ig|W_io) 的可學習 input-hidden 權重,形狀為 (4*hidden_size, input_size) 用於 k = 0 。否則,形狀為 (4*hidden_size, num_directions * hidden_size) 。如果指定了proj_size > 0,則形狀將為(4*hidden_size, num_directions * proj_size) for k > 0

  • ~LSTM.weight_hh_l[k]- (W_hi|W_hf|W_hg|W_ho) 的可學習 hidden-hidden 權重,形狀為 (4*hidden_size, hidden_size) 。如果指定了 proj_size > 0,則形狀將為 (4*hidden_size, proj_size)

  • ~LSTM.bias_ih_l[k]- (b_ii|b_if|b_ig|b_io) 的可學習 input-hidden 偏差,形狀為 (4*hidden_size)

  • ~LSTM.bias_hh_l[k]- (b_hi|b_hf|b_hg|b_ho) 的可學習 hidden-hidden 偏差,形狀為 (4*hidden_size)

  • ~LSTM.weight_hr_l[k]-形狀為 (proj_size, hidden_size) 層的可學習投影權重。僅在指定 proj_size > 0 時出現。

  • ~LSTM.weight_ih_l[k]_reverse-類似於weight_ih_l[k] 的反向。僅在 bidirectional=True 時出現。

  • ~LSTM.weight_hh_l[k]_reverse-類似於weight_hh_l[k] 的反向。僅在 bidirectional=True 時出現。

  • ~LSTM.bias_ih_l[k]_reverse-類似於bias_ih_l[k] 的反向。僅在 bidirectional=True 時出現。

  • ~LSTM.bias_hh_l[k]_reverse-類似於bias_hh_l[k] 的反向。僅在 bidirectional=True 時出現。

  • ~LSTM.weight_hr_l[k]_reverse-類似於weight_hr_l[k] 的反向。僅在指定 bidirectional=Trueproj_size > 0 時出現。

將多層長短期 memory (LSTM) RNN 應用於輸入序列。

對於輸入序列中的每個元素,每一層計算以下函數:

其中 是時間t的隱藏狀態, 是時間t的單元狀態, 是時間t的輸入, 是層的隱藏狀態時間 t-1 或初始隱藏狀態 0 分別是輸入、遺忘、單元和輸出門。 是 sigmoid 函數, 是 Hadamard 積。

在多層 LSTM 中,第 層( )的輸入 是前一層的隱藏狀態 乘以 dropout ,其中每個 是伯努利隨機變量這是 概率為 dropout

如果指定proj_size > 0,將使用帶有投影的 LSTM。這會以下列方式更改 LSTM 單元。首先, 的尺寸將從hidden_size更改為proj_size( 的尺寸將相應更改)。其次,每一層的輸出隱藏狀態將乘以一個可學習的投影矩陣: 。請注意,因此,LSTM 網絡的輸出也將具有不同的形狀。有關所有變量的確切尺寸,請參閱下麵的輸入/輸出部分。您可以在 https://arxiv.org/abs/1402.1128 中找到更多詳細信息。

輸入:輸入,(h_0,c_0)
  • input: 形狀張量(L, N, H_{in}) batch_first=False或者(N, L, H_{in}) batch_first=True包含輸入序列的特征。輸入也可以是打包的可變長度序列。看torch.nn.utils.rnn.pack_padded_sequence()或者torch.nn.utils.rnn.pack_sequence詳情。

  • h_0: 形狀張量(D * \text{num\_layers}, N, H_{out}) 包含批次中每個元素的初始隱藏狀態。如果 (h_0, c_0) 未提供,則默認為零。

  • c_0: 形狀張量(D * \text{num\_layers}, N, H_{cell}) 包含批次中每個元素的初始單元狀態。如果 (h_0, c_0) 未提供,則默認為零。

其中:

輸出:輸出,(h_n,c_n)
  • output: 形狀張量(L, N, D * H_{out}) batch_first=False或者(N, L, D * H_{out}) batch_first=True包含輸出特征(h_t)從 LSTM 的最後一層,對於每個t.如果一個torch.nn.utils.rnn.PackedSequence已作為輸入給出,輸出也將是一個打包序列。

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

  • c_n: 形狀張量(D * \text{num\_layers}, N, H_{cell}) 包含批次中每個元素的最終單元狀態。

注意

所有的權重和偏差都是從 初始化的,其中

注意

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

警告

在某些版本的 cuDNN 和 CUDA 上,RNN 函數存在已知的不確定性問題。您可以通過設置以下環境變量來強製執行確定性行為:

在 CUDA 10.1 上,設置環境變量 CUDA_LAUNCH_BLOCKING=1 。這可能會影響性能。

在 CUDA 10.2 或更高版本上,設置環境變量(注意前導冒號) CUBLAS_WORKSPACE_CONFIG=:16:8CUBLAS_WORKSPACE_CONFIG=:4096:2

有關詳細信息,請參閱cuDNN 8 Release Notes

孤兒

注意

如果滿足以下條件:1) cudnn 已啟用,2) 輸入數據在 GPU 上 3) 輸入數據具有 dtype torch.float16 4) 使用 V100 GPU,5) 輸入數據不是 PackedSequence 格式的持久化算法可以選擇以提高性能。

例子:

>>> rnn = 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) = rnn(input, (h0, c0))

相關用法


注:本文由純淨天空篩選整理自pytorch.org大神的英文原創作品 torch.nn.LSTM。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。