天天看點

詳細了解pytorch的lstm參數lstm(*input, **kwargs)

lstm(*input, **kwargs)

将多層長短時記憶(LSTM)神經網絡應用于輸入序列。

參數:

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:如果' 'True ' ',則輸入和輸出張量作為(batch, seq, feature)提供。預設值: 'False'

dropout:如果非零,則在除最後一層外的每個LSTM層的輸出上引入一個“dropout”層,相當于:attr:'dropout'。預設值:0

bidirectional:如果‘True’,則成為雙向LSTM。預設值:'False'

輸入:input,(h_0, c_0)

**input**of shape (seq_len, batch, input_size):包含輸入序列特征的張量。輸入也可以是一個壓縮的可變長度序列。

see:func:'torch.nn.utils.rnn.pack_padded_sequence' 或:func:'torch.nn.utils.rnn.pack_sequence' 的細節。

**h_0** of shape  (num_layers * num_directions, batch, hidden_size):張量包含批進行中每個元素的初始隐藏狀态。

如果RNN是雙向的,num_directions應該是2,否則應該是1。

**c_0** of shape  (num_layers * num_directions, batch, hidden_size):張量包含批進行中每個元素的初始單元格狀态。

如果沒有提供' (h_0, c_0) ',則**h_0**和**c_0**都預設為零。

輸出:output,(h_n, c_n)

**output**of shape (seq_len, batch, num_directions * hidden_size) :包含LSTM最後一層輸出特征' (h_t) '張量,

對于每個t. If a:class: 'torch.nn.utils.rnn.PackedSequence' 已經給出,輸出也将是一個打包序列。

對于未打包的情況,可以使用'output.view(seq_len, batch, num_directions, hidden_size)',正向和反向分别為方向' 0 '和' 1 '。

同樣,在包裝的情況下,方向可以分開。

**h_n** of shape  (num_layers * num_directions, batch, hidden_size):包含' t = seq_len '隐藏狀态的張量。

與*output*類似, the layers可以使用以下指令分隔

h_n.view(num_layers, num_directions, batch, hidden_size) 對于'c_n'相似

**c_n** (num_layers * num_directions, batch, hidden_size):張量包含' t = seq_len '的單元狀态

所有的權重和偏差都初始化自: 

詳細了解pytorch的lstm參數lstm(*input, **kwargs)

   where: 

詳細了解pytorch的lstm參數lstm(*input, **kwargs)
include:: cudnn_persistent_rnn.rst
           
import torch
import torch.nn as nn

# 雙向rnn例子
# rnn = nn.RNN(10, 20, 2)
# input = torch.randn(5, 3, 10)
# h0 = torch.randn(2, 3, 20)
# output, hn = rnn(input, h0)
# print(output.shape,hn.shape)
# torch.Size([5, 3, 20]) torch.Size([2, 3, 20])

# 雙向lstm例子
rnn = nn.LSTM(10, 20, 2)      #(input_size,hidden_size,num_layers)
input = torch.randn(5, 3, 10)    #(seq_len, batch, input_size)
h0 = torch.randn(2, 3, 20)       #(num_layers * num_directions, batch, hidden_size)
c0 = torch.randn(2, 3, 20)       #(num_layers * num_directions, batch, hidden_size)
# output:(seq_len, batch, num_directions * hidden_size)
# hn,cn(num_layers * num_directions, batch, hidden_size)
output, (hn, cn) = rnn(input, (h0, c0)) 
 
print(output.shape,hn.shape,cn.shape)
>>>torch.Size([5, 3, 20]) torch.Size([2, 3, 20]) torch.Size([2, 3, 20])
           

繼續閱讀