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
激活函數bias
是否使用偏置batch_first
輸入數據的形式,默認是 False,就是這樣形式,(seq(num_step), batch, input_dim),也就是將序列長度放在第一位,batch 放在第二位dropout
是否應用dropout, 默認不使用,如若使用將其設置成一個0-1的數字即可birdirectional
是否使用雙向的 rnn,默認是 False
注意某些參數的默認值在標題中已注明
輸入輸出shape
- input_shape = [時間步數, 批量大小, 特征維度] = [num_steps(seq_length), batch_size, input_dim]
- 在前向計算后會分別返回
輸出
和隱藏狀態h
,其中輸出指的是隱藏層在各個時間步上計算並輸出的隱藏狀態,它們通常作為后續輸出層的輸⼊。需要強調的是,該“輸出”本身並不涉及輸出層計算,形狀為(時間步數, 批量大小, 隱藏單元個數);隱藏狀態指的是隱藏層在最后時間步的隱藏狀態:當隱藏層有多層時,每⼀層的隱藏狀態都會記錄在該變量中;對於像⻓短期記憶(LSTM),隱藏狀態是⼀個元組(h, c),即hidden state和cell state(此處普通rnn只有一個值)
隱藏狀態h的形狀為(層數, 批量大小,隱藏單元個數)
代碼:
rnn_layer = nn.RNN(input_size=vocab_size, hidden_size=num_hiddens, )
# 定義模型, 其中vocab_size = 1027, hidden_size = 256
num_steps = 35
batch_size = 2
state = None# 初始隱藏層狀態可以不定義
X = torch.rand(num_steps, batch_size, vocab_size)
Y, state_new = rnn_layer(X, state)
print(Y.shape, len(state_new), state_new.shape)
輸出
torch.Size([35, 2, 256]) 1 torch.Size([1, 2, 256])
具體計算過程
Ht = input * Wxh + Ht-1 * Whh + bias
[batch_size, input_dim] * [input_dim, num_hiddens] + [batch_size, num_hiddens] *[num_hiddens, num_hiddens] +bias
可以發現每個隱藏狀態形狀都是[batch_size, num_hiddens], 起始輸出也是一樣的
注意:上面為了方便假設num_step=1
import torch
from torch import nn
rnn = nn.RNN(input_size=100,hidden_size=20,num_layers=1)
print(rnn)
x = torch.randn(20,3,100) #3句話,每句話 10個單詞,每個單詞100緯度
out, h = rnn(x)
print(out.shape,h.shape)
print(nn.RNN(100,20))
輸出:
RNN(100, 20)
torch.Size([20, 3, 20]) torch.Size([1, 3, 20])
RNN(100, 20)
import torch
from torch import nn
rnn = nn.RNN(input_size=100,hidden_size=20,num_layers=4)
print(rnn)
x = torch.randn(20,3,100) #3句話,每句話 10個單詞,每個單詞100緯度
out, h = rnn(x)
print(out.shape,h.shape)
print(nn.RNN(100,20))
輸出 :torch.Size([20, 3, 20]) torch.Size([4, 3, 20])