# TensorFlow函数教程：tf.nn.dynamic_rnn

## tf.nn.dynamic_rnn函数

``````tf.nn.dynamic_rnn(
cell,
inputs,
sequence_length=None,
initial_state=None,
dtype=None,
parallel_iterations=None,
swap_memory=False,
time_major=False,
scope=None
)``````

``````# create a BasicRNNCell
rnn_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_size)

# 'outputs' is a tensor of shape [batch_size, max_time, cell_state_size]

# defining initial state
initial_state = rnn_cell.zero_state(batch_size, dtype=tf.float32)

# 'state' is a tensor of shape [batch_size, cell_state_size]
outputs, state = tf.nn.dynamic_rnn(rnn_cell, input_data,
initial_state=initial_state,
dtype=tf.float32)``````
``````# create 2 LSTMCells
rnn_layers = [tf.nn.rnn_cell.LSTMCell(size) for size in [128, 256]]

# create a RNN cell composed sequentially of a number of RNNCells
multi_rnn_cell = tf.nn.rnn_cell.MultiRNNCell(rnn_layers)

# 'outputs' is a tensor of shape [batch_size, max_time, 256]
# 'state' is a N-tuple where N is the number of LSTMCells containing a
# tf.contrib.rnn.LSTMStateTuple for each cell
outputs, state = tf.nn.dynamic_rnn(cell=multi_rnn_cell,
inputs=data,
dtype=tf.float32)``````

• `cell`：RNNCell的一个实例.
• `inputs`：RNN输入.如果`time_major == False`(默认),则是一个shape为`[batch_size, max_time, ...]``Tensor`,或者这些元素的嵌套元组.如果`time_major == True`,则是一个shape为`[max_time, batch_size, ...]``Tensor`,或这些元素的嵌套元组.这也可能是满足此属性的Tensors(可能是嵌套的)元组.前两个维度必须匹配所有输入,否则秩和其他形状组件可能不同.在这种情况下,在每个时间步输入到`cell`将复制这些元组的结构,时间维度(从中获取时间)除外.在每个时间步输入到个`cell`将是一个`Tensor`或(可能是嵌套的)Tensors元组,每个元素都有维度`[batch_size, ...]`.
• `sequence_length`：(可选)大小为`[batch_size]`的int32/int64的向量.超过批处理元素的序列长度时用于复制状态和零输出.所以它更多的是正确性而不是性能.
• `initial_state`：(可选)RNN的初始状态.如果`cell.state_size`是整数,则必须是具有适当类型和shape为`[batch_size, cell.state_size]``Tensor`.如果`cell.state_size`是一个元组,则应该是张量元组,`cell.state_size`中为s设置shape`[batch_size, s]`.
• `dtype`：(可选)初始状态和预期输出的数据类型.如果未提供initial_state或RNN状态具有异构dtype,则是必需的.
• `parallel_iterations`：(默认值：32).并行运行的迭代次数.适用于那些没有任何时间依赖性并且可以并行运行的操作.该参数用于交换空间的时间.远大于1的值会使用更多内存但占用更少时间,而较小值使用较少内存但计算时间较长.
• `swap_memory`：透明地交换推理中产生的张量,但是需要从GPU到CPU的支持.这允许训练通常不适合单个GPU的RNN,具有非常小的(或没有)性能损失.
• `time_major``inputs``outputs`Tensor的形状格式.如果是true,则这些 `Tensors`的shape必须为`[max_time, batch_size, depth]`.如果是false,则这些`Tensors`的shape必须为`[batch_size, max_time, depth]`.使用`time_major = True`更有效,因为它避免了RNN计算开始和结束时的转置.但是,大多数TensorFlow数据都是batch-major,因此默认情况下,此函数接受输入并以batch-major形式发出输出.
• `scope`：用于创建子图的VariableScope；默认为“rnn”.

• `outputs`：RNN输出`Tensor`.

如果time_major == False(默认),这将是shape为`[batch_size, max_time, cell.output_size]``Tensor`.

如果time_major == True,这将是shape为`[max_time, batch_size, cell.output_size]``Tensor`.

注意,如果`cell.output_size`是整数或`TensorShape`对象的(可能是嵌套的)元组,那么`outputs`将是一个与`cell.output_size`具有相同结构的元祖,它包含与`cell.output_size`中的形状数据有对应shape的Tensors.

• `state`：最终的状态.如果`cell.state_size`是int,则会形成`[batch_size, cell.state_size]`.如果它是`TensorShape`,则将形成`[batch_size] + cell.state_size`.如果它是一个(可能是嵌套的)int或`TensorShape`元组,那么这将是一个具有相应shape的元组.如果单元格是`LSTMCells`,则`state`将是包含每个单元格的`LSTMStateTuple`的元组.

• `TypeError`：如果`cell`不是RNNCell的实例.
• `ValueError`：如果输入为None或是空列表.

App下载