循環層
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)的張量