单层
时间序列展开表示:
公式表示:
这里的[S1t→;S2t→]做的是一个拼接,如果他们都是1000维的,拼接在一起就是2000维的了。 双向RNN需要的内存是单向RNN的两倍,因为在同一时间点,双向RNN需要保存两个方向上的权重参数,在分类的时候,需要同时输入两个隐藏层输出的信息。
举例表示:
程序表示:
n是非常相似的.
定义前向和反向rnn_cell
定义前向和反向rnn_cell的初始状态
准备好序列
调用bidirectional_dynamic_rnn
import tensorflow as tf
from tensorflow.contrib import rnn
cell_fw = rnn.LSTMCell(10)
cell_bw = rnn.LSTMCell(10)
initial_state_fw = cell_fw.zero_state(batch_size)
initial_state_bw = cell_bw.zero_state(batch_size)
seq = ...
seq_length = ...
(outputs, states)=tf.nn.bidirectional_dynamic_rnn(cell_fw, cell_bw, seq,
seq_length, initial_state_fw,initial_state_bw)
out = tf.concat(outputs, 2)
多层:
时间序列展开表示:
公式表示:
结构表示:
程序表示:
def get_mul_cell(hidden_dim, num_layers):
# 创建多层lstm
def get_en_cell(hidden_dim):
# 创建单个lstm
enc_base_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_dim, forget_bias=1.0)
return enc_base_cell
return tf.nn.rnn_cell.MultiRNNCell([get_en_cell(hidden_dim) for _ in range(num_layers)])
with tf.variable_scope("encoder"):
# 构建双向lstm
encode_cell_fw = get_mul_cell(self.config.hidden_dim, self.config.num_layers)
encode_cell_bw = get_mul_cell(self.config.hidden_dim, self.config.num_layers)
bi_encoder_output, bi_encoder_state = tf.nn.bidirectional_dynamic_rnn( cell_fw=encode_cell_fw,
cell_bw=encode_cell_bw,
inputs=embed_en_seqs,
sequence_length=self.en_length,
dtype=tf.float32,
time_major=False)