torch.nn包下實現了LSTM函數,實現LSTM層。多個LSTMcell組合起來是LSTM。python
LSTM自動實現了前向傳播,不須要本身對序列進行迭代。函數
LSTM的用到的參數以下:建立LSTM指定以下參數,至少指定前三個參數編碼
input_size: 輸入特徵維數 hidden_size: 隱層狀態的維數 num_layers: RNN層的個數,在圖中豎向的是層數,橫向的是seq_len bias: 隱層狀態是否帶bias,默認爲true batch_first: 是否輸入輸出的第一維爲batch_size,由於pytorch中batch_size維度默認是第二維度,故此選項能夠將 batch_size放在第一維度。如input是(4,1,5),中間的1是batch_size,指定batch_first=True後就是(1,4,5) dropout: 是否在除最後一個RNN層外的RNN層後面加dropout層 bidirectional: 是不是雙向RNN,默認爲false,若爲true,則num_directions=2,不然爲1
爲了統一,之後都batch_first=True
code
LSTM的輸入爲:LSTM(input,(h0,co))
input
其中,指定batch_first=True
後,input就是(batch_size,seq_len,input_size)
it
(h0,c0)是初始的隱藏層,由於每一個LSTM單元其實須要兩個隱藏層的。記hidden=(h0,c0)
io
其中,h0的維度是(num_layers*num_directions, batch_size, hidden_size)
class
c0維度同h0。注意,即便batch_first=True
,這裏h0的維度依然是batch_size在第二維度import
LSTM的輸出爲:out,(hn,cn)
model
其中,out是每個時間步的最後一個隱藏層h的輸出,假若有5個時間步(即seq_len=5),則有5個對應的輸出,out的維度是:(batch_size,seq_len,hidden_size)
而hidden=(hn,cn)
,他本身實現了時間步的迭代,每次迭代須要使用上一步的輸出和hidden層,最後一步hidden=(hn,cn)
記錄了最後一各時間步的隱藏層輸出,有幾層對應幾個輸出,若是這個是RNN-encoder,則hn,cn就是中間的編碼向量。hn的維度是(num_layers*num_directions,batch_size,hidden_size),cn同。
建立一LSTM:
lstm = torch.nn.LSTM(input_size,hidden_size,num_layers,batch_first=True)
forward使用LSTM層:
out,hidden = lstm(input,hidden)
其中,hidden=(h0,c0)
是個tuple
最終獲得out,hidden
import torch # 實現一個num_layers層的LSTM-RNN class RNN(torch.nn.Module): def __init__(self,input_size, hidden_size, num_layers): super(RNN,self).__init__() self.input_size = input_size self.hidden_size=hidden_size self.num_layers=num_layers self.lstm = torch.nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True) def forward(self,input): # input應該爲(batch_size,seq_len,input_szie) self.hidden = self.initHidden(input.size(0)) out,self.hidden = lstm(input,self.hidden) return out,self.hidden def initHidden(self,batch_size): if self.lstm.bidirectional: return (torch.rand(self.num_layers*2,batch_size,self.hidden_size),torch.rand(self.num_layers*2,batch_size,self.hidden_size)) else: return (torch.rand(self.num_layers,batch_size,self.hidden_size),torch.rand(self.num_layers,batch_size,self.hidden_size)) input_size = 12 hidden_size = 10 num_layers = 3 batch_size = 2 model = RNN(input_size,hidden_size,num_layers) # input (seq_len, batch, input_size) 包含特徵的輸入序列,若是設置了batch_first,則batch爲第一維 input = torch.rand(2,4,12) model(input)