当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.compat.v1.nn.dynamic_rnn用法及代码示例


创建由 RNNCell cell 指定的循环神经网络。 (已弃用)

用法

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

参数

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

返回

  • 一对(输出,状态),其中:
  • outputs RNN 输出Tensor.

    如果 time_major == False(默认),这将是一个 Tensor 形状:[batch_size, max_time, cell.output_size]

    如果 time_major == True,这将是一个 Tensor 形状:[max_time, batch_size, cell.output_size]

    请注意,如果 cell.output_size 是整数或 TensorShape 对象的(可能嵌套的)元组,则 outputs 将是具有与 cell.output_size 相同结构的元组,包含具有与形状数据 cell.output_size 对应的形状的张量.

  • state 最后的状态。如果 cell.state_size 是 int,则其形状为 [batch_size, cell.state_size] 。如果它是 TensorShape ,它将被塑造成 [batch_size] + cell.state_size 。如果它是一个(可能是嵌套的)整数元组或 TensorShape ,这将是一个具有相应形状的元组。如果单元格是 LSTMCells state 将是一个元组,其中每个单元格包含一个 LSTMStateTuple

抛出

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

迁移到 TF2

警告:这个 API 是为 TensorFlow v1 设计的。继续阅读有关如何从该 API 迁移到本机 TensorFlow v2 等效项的详细信息。见TensorFlow v1 到 TensorFlow v2 迁移指南有关如何迁移其余代码的说明。

tf.compat.v1.nn.dynamic_rnn 与即刻执行和 tf.function 不兼容。请改用tf.keras.layers.RNN 进行 TF2 迁移。以 LSTM 为例,您可以使用 tf.keras.layers.LSTMCell 或直接通过 tf.keras.layers.LSTM 实例化 tf.keras.layers.RNN 层。创建 keras 层后,您可以通过调用具有输入和状态的层来获取输出和状态。有关 Keras RNN 的更多详细信息,请参阅本指南。您还可以在本文档中找到更多关于 Keras RNN 和 TF compat v1 rnn 的区别和比较的详细信息

到原生 TF2 的结构映射

前:

# create 2 LSTMCells
rnn_layers = [tf.compat.v1.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.compat.v1.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.nn.rnn_cell.LSTMStateTuple for each cell
outputs, state = tf.compat.v1.nn.dynamic_rnn(cell=multi_rnn_cell,
                                             inputs=data,
                                             dtype=tf.float32)

后:

# RNN layer can take a list of cells, which will then stack them together.
# By default, keras RNN will only return the last timestep output and will not
# return states. If you need whole time sequence output as well as the states,
# you can set `return_sequences` and `return_state` to True.
rnn_layer = tf.keras.layers.RNN([tf.keras.layers.LSTMCell(128),
                                 tf.keras.layers.LSTMCell(256)],
                                return_sequences=True,
                                return_state=True)
outputs, output_states = rnn_layer(inputs, states)

如何映射参数

TF1 参数名称 TF2 参数名称 注意
cell cell 在RNN层构造函数中
inputs inputs 在RNN层__call__
sequence_length 未使用 在 RNN 之前添加遮罩层:以达到相同的结果。
initial_state initial_state 在RNN层__call__
dtype dtype 在RNN层构造函数中
parallel_iterations 不支持
swap_memory 不支持
time_major time_major 在RNN层构造函数中
scope 不支持

警告:此函数已弃用。它将在未来的版本中删除。更新说明:请使用keras.layers.RNN(cell),相当于这个API

执行 inputs 的完全动态展开。

例子:

# create a BasicRNNCell
rnn_cell = tf.compat.v1.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.compat.v1.nn.dynamic_rnn(rnn_cell, input_data,
                                   initial_state=initial_state,
                                   dtype=tf.float32)
# create 2 LSTMCells
rnn_layers = [tf.compat.v1.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.compat.v1.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.nn.rnn_cell.LSTMStateTuple for each cell
outputs, state = tf.compat.v1.nn.dynamic_rnn(cell=multi_rnn_cell,
                                   inputs=data,
                                   dtype=tf.float32)

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.compat.v1.nn.dynamic_rnn。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。