RNN LSTM 最基本知识
RNNCell1
2
3
4
5
6
7
8
9
10
11import tensorflow as tf
import numpy as np
cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128) # state_size = 128
print(cell.state_size) # 128
inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size
h0 = cell.zero_state(32, np.float32) # 通过zero_state得到一个全0的初始状态,形状为(batch_size, state_size)
output, h1 = cell(inputs, h0) #调用函数
print(h1.shape) # (32, 128)
BasicLSTMCell1
2
3
4
5
6
7
8
9import tensorflow as tf
import numpy as np
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=128)
inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size
h0 = lstm_cell.zero_state(32, np.float32) # 通过zero_state得到一个全0的初始状态
output, h1 = lstm_cell(inputs, h0)
print(h1.h) # shape=(32, 128)
print(h1.c) # shape=(32, 128)
堆叠RNNCell:MultiRNNCell1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34import tensorflow as tf
import numpy as np
# 每调用一次这个函数就返回一个BasicRNNCell
def get_a_cell():
return tf.nn.rnn_cell.BasicRNNCell(num_units=128)
# 用tf.nn.rnn_cell MultiRNNCell创建3层RNN
cell = tf.nn.rnn_cell.MultiRNNCell([get_a_cell() for _ in range(3)]) # 3层RNN
# 得到的cell实际也是RNNCell的子类
# 它的state_size是(128, 128, 128)
# (128, 128, 128)并不是128x128x128的意思
# 而是表示共有3个隐层状态,每个隐层状态的大小为128
print(cell.state_size) # (128, 128, 128)
# 使用对应的call函数
inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size
h0 = cell.zero_state(32, np.float32) # 通过zero_state得到一个全0的初始状态, tuple中含有3个32x128的向量
output, h1 = cell.call(inputs, h0)
print(h1) # tuple中含有3个32x128的向量
符号说明
RNN
单层RNN
1 | import tensorflow as tf |
1 | outputs_val.shape: (4, 2, 5) states_val.shape: (4, 5) |
首先输入X是一个 [batch_size,step,input_size] = [4,2,3] 的tensor,注意我们这里调用的是BasicRNNCell,只有一层循环网络,outputs是最后一层每个step的输出,它的结构是[batch_size,step,n_neurons] = [4,2,5],states是每一层的最后那个step的输出,由于本例中,我们的循环网络只有一个隐藏层,所以它就代表这一层的最后那个step的输出,因此它和step的大小是没有关系的,我们的X有4个样本组成,输出神经元大小n_neurons是5,因此states的结构就是[batch_size,n_neurons] = [4,5],最后我们观察数据,states的每条数据正好就是outputs的最后一个step的输出。
三层RNN
1 | import tensorflow as tf |
1 | outputs_val.shape: |
outputs是最后一层的输出,即 [batch_size,step,n_neurons] = [4,2,5]
states是每一层的最后一个step的输出,即三个结构为 [batch_size,n_neurons] = [4,5] 的tensor。
LSTM
三层LSTM
下面我们继续讲当由BasicLSTMCell构造单元工厂的时候,只讲多层的情况,我们只需要将上面的BasicRNNCell替换成BasicLSTMCell就行了,打印信息如下:
1 | outputs_val.shape: |
如果您不查看框内的内容,LSTM单元看起来与常规单元格完全相同,除了它的状态分为两个向量:h(t)和c(t)。你可以将h(t)视为短期状态,将c(t)视为长期状态。
因此我们的states包含三个LSTMStateTuple,每一个表示每一层的最后一个step的输出,这个输出有两个信息,一个是h表示短期记忆信息,一个是c表示长期记忆信息。维度都是[batch_size,n_neurons] = [4,5],states的最后一个LSTMStateTuple中的h就是outputs的最后一个step的输出。
GRU
GRU 与RNN 代码基本一致,把
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
改为 basic_cell = tf.nn.rnn_cell.GRUCell(num_units=n_neurons)即可,结果分析同 RNN。
1 | import tensorflow as tf |
1 | outputs_val.shape: |
标题 | 说明 | 附加 |
---|---|---|
看图理解长短期记忆网络与门控循环网络 | 翻译自 Illustrated Guide to LSTM’s and GRU’s: A step by step explanation | 20181013 |
图解RNN、RNN变体、Seq2Seq、Attention机制 | 何之源 | |
[译] 理解 LSTM 网络 | 译自 Christopher Olah 的博文 | 20180828 |
tf.nn.dynamic_rnn返回值详解 | 迗迗迗蘫 | 20180801 |