1. 程式人生 > 實用技巧 >pytorch上的迴圈層和全連線層操作

pytorch上的迴圈層和全連線層操作

迴圈層

pytorch中的三種迴圈層的實現:

層對應的類 功能
torch.nn.RNN() 多層RNN單元
torch.nn.LSTM() 多層長短期記憶LSTM單元
torch.nn.GRU() 多層門限迴圈GRU單元
torch.nn.RNNCell() 一個RNN迴圈層單元
torch.nn.LSTMCell() 一個長短期記憶LSTM單元
torch.nn.GRUCell() 一個門限迴圈GRU單元

下面以torch.nn.RNN()為例介紹迴圈層的引數、輸入和輸出

nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=True, batch_first=False, dropout=0, bidirectional=False)

  • input_size輸入特徵的維度, 一般rnn中輸入的是詞向量,那麼 input_size 就等於一個詞向量的維度
  • hidden_size隱藏層神經元個數,或者也叫輸出的維度(因為rnn輸出為各個時間步上的隱藏狀態)
  • num_layers網路的層數
  • nonlinearity啟用函式(預設是tanh啟用函式,可選relu)
  • bias是否使用偏置(預設是True)
  • batch_first輸入資料的形式,預設是 False,就是這樣形式,(seq(num_step), batch, input_dim),也就是將序列長度放在第一位,batch 放在第二位,如果是True,那麼輸入輸出的shape應該是[batch_size,time_step,feature]
  • dropout是否應用dropout(除外最後一層), 預設不使用,如若使用將其設定成一個0或者非0的數字即可
  • birdirectional是否使用雙向的 rnn,預設是 False

  RNN的輸入為input和h_0,其中input是一個形狀為(seq_len,batch,input_size)的張量。h_0則是一個形狀為(num_layers*num_directions,batch, hidden_size)儲存著初始隱狀態的張量。如果不提供就預設為0。如果是雙向RNN,num_directions等於2,否則等於1.

  RNN的輸出為output和h_n,其中output是一個形狀為(seq_len, batch, hidden_size*num_directions)的張量,儲存著RNN最後一層的輸出特徵。如果輸入是被填充過的序列,那麼輸出也是被填充過的序列。

  h_n是一個形狀為(num_layers*num_directions, batch, hidden_size)的張量,儲存著最後一個時刻的隱狀態。

全連線層

  通常所說的全連線層是指一個由多個神經元組成的層,其所有的輸出和該層所有的輸入都有連線,即每個輸入都會影響所有的神經元的輸出。在pytorch中的nn.Linear()表示線性變換,全連線層可以看作是nn.Linear()表示線性邊層再加上一個啟用函式層所構成的結構。

具體操作如下:

  torch.nn.Linear(in_features,out_features, bias = True)

  in_features:每個輸入樣本的特徵數量(看作神經元個數)

  out_features:每個樣本輸出的特徵數量

  bias :是否新增偏置

Linear的輸入為(N,in_features)的張量,輸出為(N,out_features)的張量