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

基础 RNN 层

[source]

RNN class

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单元实例或一个RNN单元实例列表. 一个RNN单元是一个具有以下内容的类: - 一个call(input_at_t, states_at_t)方法,返回 (output_at_t, states_at_t_plus_1).该单元的call方法还可以接受可选参数constants,请参阅下面的"关于传递外部常量的注意事项”部分. - 一个state_size属性.这可以是一个整数(单个状态),在这种情况下,它是循环状态的大小.这也可以是一个整数列表/元组(每个状态一个大小). - 一个output_size属性,一个整数. - 一个get_initial_state(batch_size=None)方法,该方法创建一个张量,用于作为初始状态传递给call(),如果用户没有通过其他方式指定初始状态.返回的初始状态应具有形状(batch_size, cell.state_size). 该单元可以选择创建一个全零张量,或其他基于单元实现的张量. inputs是RNN层的输入张量,具有形状(batch_size, timesteps, features). 如果该方法未被单元实现,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,网络将展开,否则将使用符号循环.展开可以加速RNN,尽管它往往更占用内存.展开仅适用于短序列. zero_output_for_mask: 布尔值(默认False).是否应使用零来表示掩码的时间步的输出. 注意,此字段仅在return_sequencesTrue且提供了mask时使用. 如果您希望重用RNN的原始输出序列而不受掩码时间步的干扰,例如合并双向RNN,这可能很有用.

调用参数: inputs: 输入张量. initial_state: 初始状态张量列表,传递给单元的第一次调用. mask: 形状为[batch_size, timesteps]的二进制张量,指示是否应掩码给定的时间步. 一个True条目表示应利用相应的时间步,而False条目表示应忽略相应的时间步. training: Python布尔值,指示层应在训练模式还是推理模式下运行.此参数在调用单元时传递给它. 这是与使用dropout的单元一起使用的.

输入形状: 形状为(batch_size, timesteps, features)的3D张量.

输出形状:

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

掩码:

该层支持对具有可变数量时间步的输入数据进行掩码.要在数据中引入掩码, 请使用mask_zero参数设置为Truekeras.layers.Embedding层.

关于在RNN中使用状态性的注意事项:

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

要启用状态性:

  • 在层构造函数中指定stateful=True.
  • 为您的模型指定一个固定的批次大小,通过传递 如果是顺序模型: batch_input_shape=(...)到模型的第一层. 否则对于具有一个或多个Input层的功能模型: batch_shape=(...)到模型的所有第一层. 这是您输入的预期形状 包括批次大小. 它应该是一个整数元组,例如(32, 10, 100).
  • 在调用fit()时指定shuffle=False.

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

关于指定RNN的初始状态的注意事项:

您可以通过使用关键字参数initial_state调用它们来指定RNN层的初始状态.initial_state的值应是一个表示RNN层初始状态的张量或张量列表.

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

示例:

from keras.src.layers import RNN
from keras.src import ops

# 首先,让我们定义一个作为层子类的RNN单元.
class MinimalRNNCell(keras.layers.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')
        self.built = True

    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]

# 让我们在RNN层中使用这个单元:

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

# 以下是如何使用该单元构建一个堆叠RNN:

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