1. 程式人生 > >LSTM和GRU原理及pytorch程式碼,輸入輸出大小說明

LSTM和GRU原理及pytorch程式碼,輸入輸出大小說明

 

 

 

 

 

 

 

#RNN
rnn=nn.RNN(10,20,2) #(each_input_size, hidden_state, 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)
output,hn=rnn(input,h0)
print(output.size(),hn.size())


#LSTM
rnn=nn.LSTM(10,20,2) #(each_input_size, hidden_state, 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,(hn,cn)=rnn(input,(h0,c0))
print(output.size(),hn.size(),cn.size())


#GRU
rnn=nn.GRU(10,20,2)
input=torch.randn(5,3,10)
h0=torch.randn(2,3,20)
output,hn=rnn(input,h0)
print(output.size(),hn.size())

 

先上結論:

  1. output儲存了最後一層,每個time step的輸出h,如果是雙向LSTM,每個time step的輸出h = [h正向, h逆向] (同一個time step的正向和逆向的h連線起來)。
  2. h_n儲存了每一層,最後一個time step的輸出h,如果是雙向LSTM,單獨儲存前向和後向的最後一個time step的輸出h。
  3. c_n與h_n一致,只是它儲存的是c的值。

output是一個三維的張量,第一維表示序列長度,第二維表示一批的樣本數(batch),第三維是 hidden_size(隱藏層大小) * num_directions ,雙向的時候num_directions是2

h_n是一個三維的張量,第一維是num_layers*num_directions,num_layers是我們定義的神經網路的層數,num_directions在上面介紹過,取值為1或2,表示是否為雙向LSTM

c_n與h_n的結構一樣,就不重複贅述了。