构建双向GRU网络
直接上双向GRU层的代码:
def BidirectionalGRUEncoder(self, inputs):
# 双向GRU的编码层,将一句话中的所有单词或者一个文档中的所有句子向量进行编码得到一个 2×hidden_size的输出向量,然后在经过Attention层,将所有的单词或句子的输出向量加权得到一个最终的句子/文档向量。
# 输入inputs的shape是[batch_size, max_time, voc_size]
with tf.variable_scope(""):
GRU_cell_fw = rnn.GRUCell(self.hidden_size)
GRU_cell_bw = rnn.GRUCell(self.hidden_size)
((fw_outputs, bw_outputs), (_, _)) = tf.nn.bidirectional_dynamic_rnn(cell_fw=GRU_cell_fw,
cell_bw=GRU_cell_bw,
inputs=inputs,
sequence_length=None,
dtype=tf.float32)
outputs = tf.concat((fw_outputs, bw_outputs), 2)
return outputs
tf.nn.bidirectional_dynamic_rnn Tensorflow API里面的定义
tf.nn.bidirectional_dynamic_rnn(
cell_fw,
cell_bw,
inputs,
sequence_length=None,
initial_state_fw=None,
initial_state_bw=None,
dtype=None,
parallel_iterations=None,
swap_memory=False,
time_major=False,
scope=None
)
参数分别为:
- cell_fw RNN cell 的一个实例,用于前向网络
- cell_bw RNN cell 的一个实例,用于后向网络
- input 输入,当参数time_major == Flase(默认) 时,维度必须为[batch_size,max_time...];当参数time_major == True 时,维度必须为[max_time,batch_size...]
- sequence_legth(可选)int 32 或 int 64 [batch_size] 包含每个批处理的实际长度,如果未提供,则认为序列是完整的,按照0到max_time 进行时间反转
- intial_state_bw:(可选)前向RNN的初始状态。
- intial_state_fw:(可选)与for相同intial_state_bw,但使用相应的属性cell_bw 。
- dtype:(可选)初始状态和预期输出的数据类型。
- parallel_iterations :(默认值:32)。并行运行的迭代次数。那些没有任何时间依赖性并且可以并行运行的操作将是。该参数用于交换空间的时间。值>> 1使用更多内存但占用更少时间,而较小值使用较少内存但计算时间较长。
- swap_memory:透明地交换前向推理中产生的张量,但需要从GPU到CPU的后支柱。这允许训练通常不适合单个GPU的RNN,具有非常小的(或没有)性能损失。
- time_major:
inputs
和outputs
张量的形状格式。如果是True,那些Tensors
必须成形[max_time, batch_size, depth]
。如果False,这些Tensors
必须成形[batch_size, max_time, depth]
。使用time_major = True
更有效,因为它避免了RNN计算开始和结束时的转置。但是,大多数TensorFlow数据都是批处理主要数据,因此默认情况下,此函数接受输入并以批处理主体形式发出输出。 - scope:用于创建子图的VariableScope; 默认为“bidirectional_rnn”
Outputs
- 输出的格式为一个元组(outputs, output_states),其中outputs也是一个元组,包含前向和后向GRU的输出,如果If time_major == False (default),输出维度为
[batch_size, max_time, cell_fw.output_size],[batch_size, max_time, cell_bw.output_size]否则输出维度为[max_time, batch_size, cell_fw.output_size],[max_time, batch_size, cell_bw.output_size],返回的是一个元组,而不是一个连接的Tensor,如果需要连接则需要 tf.concat(outputs,2)
- output_states:包含前向和后向的末态 A tuple (output_state_fw, output_state_bw)