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


Python tf.keras.layers.RNN用法及代码示例


循环层的基类。

继承自:LayerModule

用法

tf.keras.layers.RNN(
    cell, return_sequences=False, return_state=False, go_backwards=False,
    stateful=False, unroll=False, time_major=False, **kwargs
)

参数

  • cell RNN 单元实例或 RNN 单元实例列表。 RNN 单元是一个类,它具有:
    • 一个 call(input_at_t, states_at_t) 方法,返回 (output_at_t, states_at_t_plus_1) 。单元格的调用方法也可以采用可选参数 constants ,请参阅下面的“关于传递外部常量的注意事项”部分。
    • state_size 属性。这可以是单个整数(单个状态),在这种情况下,它是循环状态的大小。这也可以是整数列表/元组(每个状态一个大小)。 state_size 也可以是 TensorShape 或 TensorShape 的元组/列表,以表示高维状态。
    • output_size 属性。这可以是单个整数或 TensorShape,表示输出的形状。出于向后兼容的原因,如果该属性对单元格不可用,则该值将由 state_size 的第一个元素推断。
    • get_initial_state(inputs=None, batch_size=None, dtype=None) 方法创建一个张量,如果用户没有通过其他方式指定任何初始状态,则该张量将作为初始状态馈送到 call()。返回的初始状态应具有 [batch_size, cell.state_size] 的形状。单元格可能会根据单元格的实现选择创建一个充满零或充满其他值的张量。 inputs 是 RNN 层的输入张量,它应该包含作为其 shape[0] 的批量大小,以及 dtype。请注意,在图形构建过程中,shape[0] 可能是None。提供inputs 或一对batch_sizedtypebatch_size 是一个标量张量,表示输入的批量大小。 dtypetf.DType,表示输入的 dtype。为了向后兼容,如果cell没有实现这个方法,RNN层会创建一个大小为[batch_size, cell.state_size]的零填充张量。在 cell 是 RNN 单元实例列表的情况下,这些单元将在 RNN 中相互堆叠,从而形成高效的堆叠 RNN。
  • return_sequences 布尔值(默认 False )。是返回输出序列中的最后一个输出,还是返回完整序列。
  • return_state 布尔值(默认 False )。是否返回除了输出之外的最后一个状态。
  • go_backwards 布尔值(默认 False )。如果为 True,则反向处理输入序列并返回反向序列。
  • stateful 布尔值(默认 False )。如果为 True,则批次中索引 i 处每个样本的最后状态将用作下一批中索引 i 的样本的初始状态。
  • unroll 布尔值(默认 False )。如果为 True,则网络将展开,否则将使用符号循环。展开可以speed-up一个RNN,虽然它往往更多memory-intensive。展开仅适用于短序列。
  • time_major inputsoutputs 张量的形状格式。如果为 True,输入和输出的形状将是 (timesteps, batch, ...) ,而在 False 情况下,它将是 (batch, timesteps, ...) 。使用time_major = True 效率更高一些,因为它避免了 RNN 计算开始和结束时的转置。但是,大多数 TensorFlow 数据是 batch-major,因此默认情况下,此函数接受输入并以 batch-major 形式发出输出。
  • zero_output_for_mask 布尔值(默认 False )。输出是否应为掩码时间步使用零。请注意,此字段仅在return_sequences 为 True 并提供掩码时使用。如果您想重用 RNN 的原始输出序列而不受掩码时间步长的干扰,例如合并双向 RNN,它会很有用。

属性

  • states

有关 RNN API 使用的详细信息,请参阅 Keras RNN API 指南。

调用参数:

  • inputs:输入张量。
  • mask: 形状的二进制张量[batch_size, timesteps]指示是否应屏蔽给定的时间步长。个人True条目指示应使用相应的时间步长,而Falseentry 表示应该忽略相应的时间步长。
  • training:Python 布尔值,指示层应该在训练模式还是推理模式下运行。此参数在调用时传递给单元格。这适用于使用 dropout 的单元格。
  • initial_state:要传递给单元的第一次调用的初始状态张量列表。
  • constants:在每个时间步传递给单元的常量张量列表。

输入形状:

当time_major 为真时,N-D 张量形状为[batch_size, timesteps, ...][timesteps, batch_size, ...]

输出形状:

  • 如果 return_state :张量列表。第一个张量是输出。剩余的张量是最后的状态,每个状态都具有 [batch_size, state_size] 形状,其中 state_size 可能是高维张量形状。
  • 如果 return_sequences :N-D 张量的形状为 [batch_size, timesteps, output_size] ,其中 output_size 可能是高维张量形状,或者 [timesteps, batch_size, output_size]time_major 为真时。
  • 否则,N-D 形状为 [batch_size, output_size] 的张量,其中 output_size 可能是高维张量形状。

掩蔽:

该层支持对具有可变时间步数的输入数据进行屏蔽。要将掩码引入数据,请使用 [tf.keras.layers.Embedding] 层,并将 mask_zero 参数设置为 True

在 RNN 中使用状态性的注意事项:您可以将 RNN 层设置为'stateful',这意味着为一个批次中的样本计算的状态将被重用于下一批中的样本的初始状态。这假设不同连续批次中的样本之间存在one-to-one 映射。

要启用有状态:

- Specify `stateful=True` in the layer constructor.
- Specify a fixed batch size for your model, by passing
  If sequential model:
    `batch_input_shape=(...)` to the first layer in your model.
  Else for functional model with 1 or more Input layers:
    `batch_shape=(...)` to all the first layers in your model.
  This is the expected shape of your inputs
  *including the batch size*.
  It should be a tuple of integers, e.g. `(32, 10, 100)`.
- Specify `shuffle=False` when calling `fit()`.

要重置模型的状态,请在特定层或整个模型上调用 .reset_states()

关于指定 RNN 初始状态的注意事项:您可以通过使用关键字参数 initial_state 来象征性地指定 RNN 层的初始状态。 initial_state 的值应该是一个张量或张量列表,表示 RNN 层的初始状态。

您可以通过使用关键字参数 states 调用 reset_states 以数字方式指定 RNN 层的初始状态。 states 的值应该是一个 numpy 数组或 numpy 数组列表,表示 RNN 层的初始状态。

将外部常量传递给 RNN 的注意事项:您可以使用 RNN.__call__ (以及 RNN.call )方法的 constants 关键字参数将 "external" 常量传递给单元格。这要求 cell.call 方法接受相同的关键字参数 constants 。这些常数可用于在额外的静态输入(不随时间变化)上调节单元转换,也就是注意力机制。

例子:

# First, let's define a RNN Cell, as a layer subclass.

class MinimalRNNCell(keras.layers.Layer):

    def __init__(self, units, **kwargs):
        self.units = units
        self.state_size = units
        super(MinimalRNNCell, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
                                      initializer='uniform',
                                      name='kernel')
        self.recurrent_kernel = self.add_weight(
            shape=(self.units, self.units),
            initializer='uniform',
            name='recurrent_kernel')
        self.built = True

    def call(self, inputs, states):
        prev_output = states[0]
        h = backend.dot(inputs, self.kernel)
        output = h + backend.dot(prev_output, self.recurrent_kernel)
        return output, [output]

# Let's use this cell in a RNN layer:

cell = MinimalRNNCell(32)
x = keras.Input((None, 5))
layer = RNN(cell)
y = layer(x)

# Here's how to use the cell to build a stacked RNN:

cells = [MinimalRNNCell(32), MinimalRNNCell(64)]
x = keras.Input((None, 5))
layer = RNN(cells)
y = layer(x)

相关用法


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