TF:
单个RNN单元可以调用:
rnn_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=128) # num_units是隐藏状态的特征维数,如果直接将h当作输出,则输出特征的维数是128
(也可以调用tf.nn.rnn_cell.BasicRNNCell(num_units=128)或tf.nn.rnn_cell.GRUCell(num_units=128)等rnn_cell_impl.py里的类)
RNN单元纵向堆叠(多层RNN网络):
multi_cell = tf.nn.rnn_cell.MultiRNNCell(
[rnn, rnn, rnn])
RNN单元横向扩展(时间维度上):
lstm_outputs, final_state = tf.nn.dynamic_rnn(multi_cell, lstm_inputs, initial_state=initial_state)
# inputs是输入x: shape=(batch_size, 序列长度/时间步/句子长度, embedding_size(可能没有embedding))
# initial_state是初始隐藏状态h0: shape=(batch_size, multi_cell.state_size)
# lstm_outputs是 序列长度/时间步/句子长度 所有步的输出: shape=(batch_size, 序列长度/时间步/句子长度, cell.output_size),如果对hidden_state没有做特殊输出处理,那么output_size=hidden_size
Pytorch:
单个RNN单元可以调用torch.nn.RNNCell(), LSTMCell(), GRUCell():
rnn = nn.LSTMCell(10, 20) # 初始化LSTMCell, 输入x的特征数=10, 输出隐藏状态的特征数=20
input = torch.randn(6, 3, 10) # 字段长度/时间步总数=6, batch_size=3, 输入x的特征数=10
hx = torch.randn(3, 20) # 隐藏状态特征: batch_size=3, 输出隐藏状态的特征数=20
cx = torch.randn(3, 20) # 细胞状态特征: 同上
output = [] # 收集每个 字/时间步 的输出(如果不对隐藏状态做处理就输出,则hx就是output)
for i in range(6): # 由于调用的是单个cell,所以对整个字段循环
hx, cx = rnn(input[i], (hx, cx)) # 输入当前x和上一个单元的隐藏状态和细胞状态
output.append(hx)
RNN扩展,可以直接调用torch.nn.RNN(), LSTM(), GRU():
rnn = nn.LSTM(10, 20, 2) # 初始化LSTM, 输入x的特征数=10, 输出隐藏状态的特征数=20, LSTM的层数=2
input = torch.randn(5, 3, 10) # 字段长度/时间步总数=5, batch_size=3, 输入x的特征数=10
h0 = torch.randn(2, 3, 20) # 初始隐藏状态特征: 层数*方向数(双向LSTM时=2)=2, batch_size=3, 输出隐藏状态的特征数=20. 若没定义默认为0
c0 = torch.randn(2, 3, 20) # 初始细胞状态特征: 同上
output, (hn, cn) = rnn(input, (h0, c0)) # 返回的output是LSTM最后一层(这里是第二层)所有的字/时间步 的输出特征, output的shape=(5, 3, 20); hn和cn是最后一个字/时间步 的隐藏状态特征和细胞状态特征,shape和h0,c0一样.