Keras 3 API 文档 / 层 API / 循环层 / 基础 RNN 层

基础 RNN 层

[源]

RNN

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

循环层的基础类。

参数

  • cell:一个 RNN cell 实例或 RNN cell 实例的列表。RNN cell 是一个具有以下方法的类:
    • 一个 call(input_at_t, states_at_t) 方法,返回 (output_at_t, states_at_t_plus_1)。cell 的 call 方法还可以接受可选参数 constants,参见下方的“关于传递外部常量”部分。
    • 一个 state_size 属性。它可以是一个整数(单个状态),在这种情况下,它是循环状态的大小。它也可以是一个整数列表/元组(每个状态一个大小)。
    • 一个 output_size 属性,一个整数。
    • 一个 get_initial_state(batch_size=None) 方法,用于创建一个 tensor,该 tensor 将作为初始状态传递给 call() 方法,如果用户未通过其他方式指定任何初始状态。返回的初始状态应具有形状 (batch_size, cell.state_size)。cell 可以选择创建一个全零 tensor,或根据 cell 的实现创建其他值的 tensor。inputs 是 RNN 层的输入 tensor,形状为 (batch_size, timesteps, features)。如果 cell 未实现此方法,RNN 层将创建一个形状为 (batch_size, cell.state_size) 的全零 tensor。如果 cell 是 RNN cell 实例的列表,则这些 cell 将在 RNN 中堆叠起来,形成高效的堆叠式 RNN。
  • return_sequences:布尔值 (默认值 False)。是返回输出序列中的最后一个输出,还是返回完整序列。
  • return_state:布尔值 (默认值 False)。除了输出之外,是否返回最后一个状态。
  • go_backwards:布尔值 (默认值 False)。如果为 True,则反向处理输入序列并返回反转的序列。
  • stateful:布尔值 (默认值 False)。如果为 True,则一批次中索引为 i 的每个样本的最后一个状态将用作下一批次中索引为 i 的样本的初始状态。
  • unroll:布尔值 (默认值 False)。如果为 True,则网络将被展开,否则将使用符号循环。展开可以加速 RNN,但往往会占用更多内存。展开仅适用于短序列。
  • zero_output_for_mask:布尔值 (默认值 False)。被遮罩的时间步长输出是否应使用零。请注意,此字段仅在 return_sequencesTrue 且提供了 mask 时使用。如果您想重用 RNN 的原始输出序列而不受被遮罩时间步长的干扰,例如合并双向 RNN,此功能会很有用。

调用参数

  • sequences:一个形状为 (batch_size, timesteps, features) 的 3D tensor。
  • initial_state:要传递给 cell 第一次调用的初始状态 tensor 列表。
  • mask:形状为 [batch_size, timesteps] 的二值 tensor,表示是否应对给定时间步长进行遮罩。单个 True 条目表示应利用相应的时间步长,而 False 条目表示应忽略相应的时间步长。
  • training:Python 布尔值,指示层应在训练模式下行为还是在推理模式下行为。调用 cell 时会将此参数传递给 cell。这适用于使用 dropout 的 cell。

输出形状

  • 如果为 return_state:一个 tensor 列表。第一个 tensor 是输出。其余 tensor 是最后一个状态,每个 tensor 的形状为 (batch_size, state_size),其中 state_size 可以是高维 tensor 形状。
  • 如果为 return_sequences:形状为 (batch_size, timesteps, output_size) 的 3D tensor。

遮罩

此层支持对具有可变时间步长数量的输入数据进行遮罩。要为数据引入遮罩,请使用 mask_zero 参数设置为 Truekeras.layers.Embedding 层。

关于在 RNN 中使用有状态性的说明

您可以将 RNN 层设置为“有状态”('stateful'),这意味着在一个批次中为样本计算的状态将用作下一个批次中样本的初始状态。这假设不同连续批次中的样本之间存在一对一的映射。

启用有状态性的方法

  • 在层构造函数中指定 stateful=True
  • 通过将 batch_size=... 传递给模型的 Input 层,为模型指定固定的批次大小。请记住,在调用 fit() 时也要指定相同的 batch_size=...,或者使用类似生成器的数据源,例如 keras.utils.PyDatasettf.data.Dataset
  • 调用 fit() 时指定 shuffle=False,因为您的批次应按时间顺序排列。

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

关于指定 RNN 初始状态的说明

您可以通过在调用 RNN 层时使用关键字参数 initial_state 来符号化地指定它们的初始状态。initial_state 的值应为 tensor 或 tensor 列表,表示 RNN 层的初始状态。

您可以通过调用 reset_state() 时使用关键字参数 states 来数值化地指定 RNN 层的初始状态。states 的值应为 numpy 数组或 numpy 数组列表,表示 RNN 层的初始状态。

示例

from keras.layers import RNN
from keras import ops

# First, let's define a RNN Cell, as a layer subclass.
class MinimalRNNCell(keras.Layer):

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

    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')

    def call(self, inputs, states):
        prev_output = states[0]
        h = ops.matmul(inputs, self.kernel)
        output = h + ops.matmul(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)