RNN 类tf_keras.layers.RNN(
cell,
return_sequences=False,
return_state=False,
go_backwards=False,
stateful=False,
unroll=False,
time_major=False,
**kwargs
)
循环层的基类。
有关 RNN API 用法的详细信息,请参阅 TF-Keras RNN API 指南。
参数
call(input_at_t, states_at_t) 方法,返回 (output_at_t, states_at_t_plus_1)。单元的 call 方法还可以接受可选参数 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_size 和 dtype 的组合。batch_size 是表示输入批次大小的标量张量。dtype 是 tf.DType,表示输入的 dtype。出于向后兼容的原因,如果单元未实现此方法,RNN 层将创建一个大小为 [batch_size, cell.state_size] 的零填充张量。如果 cell 是 RNN 单元实例的列表,则这些单元将在 RNN 中堆叠在一起,从而形成一个高效的堆叠 RNN。False)。是返回输出序列的最后一个输出,还是返回整个序列。False)。是否在输出之外返回最后一个状态。False)。如果为 True,则向后处理输入序列并返回反转的序列。False)。如果为 True,则批次中索引 i 的每个样本的最后一个状态将用作下一个批次中索引 i 的样本的初始状态。False)。如果为 True,则网络将被展开,否则将使用符号循环。展开可以加速 RNN,尽管它往往更占用内存。展开仅适用于短序列。inputs 和 outputs 张量的形状格式。如果为 True,则输入和输出的形状为 (timesteps, batch, ...),而在 False 的情况下,形状为 (batch, timesteps, ...)。使用 time_major = True 更高效一些,因为它避免了 RNN 计算开始和结束时的转置。但是,大多数 TensorFlow 数据都是批次主导的,因此默认情况下此函数以批次主导形式接受输入并发出输出。False)。对于被屏蔽的时间步,输出是否应使用零。请注意,此字段仅在 return_sequences 为 True 且提供了 mask 时使用。如果您想在不干扰被屏蔽时间步的情况下重用 RNN 的原始输出序列,例如合并双向 RNN,这会很有用。调用参数
[batch_size, timesteps] 的二元张量,指示是否应屏蔽给定的时间步。单个 True 条目表示应使用相应的时间步,而 False 条目表示应忽略相应的时间步。输入形状
N 维张量,形状为 [batch_size, timesteps, ...],或当 time_major 为 True 时为 [timesteps, batch_size, ...]。
输出形状
return_state 为 True:一个张量列表。第一个张量是输出。其余张量是最后一个状态,每个张量的形状为 [batch_size, state_size],其中 state_size 可以是高维张量形状。return_sequences 为 True:N 维张量,形状为 [batch_size, timesteps, output_size],其中 output_size 可以是高维张量形状,或者当 time_major 为 True 时为 [timesteps, batch_size, output_size]。[batch_size, output_size],其中 output_size 可以是高维张量形状。掩码:此层支持对具有可变数量时间步的输入数据进行掩码。要向数据引入掩码,请使用具有 mask_zero 参数设置为 True 的 [tf.keras.layers.Embedding] 层。
关于 RNN 中状态使用的说明:您可以将 RNN 层设置为“stateful”(有状态),这意味着一个批次中样本的状态将被用作下一个批次中样本的初始状态。这假设不同连续批次中的样本之间存在一对一的映射。
要启用 stateful: - 在层构造函数中指定 stateful=True。 - 为您的模型指定固定的批次大小,方法是将 如果是顺序模型:batch_input_shape=(...) 传递给模型中的第一个层。否则,对于具有 1 个或多个 Input 层的函数式模型:将 batch_shape=(...) 传递给模型中的所有第一个层。这是您输入的预期形状包括批次大小。它应该是一个整数元组,例如 (32, 10, 100)。 - 调用 fit() 时指定 shuffle=False。
要重置模型的状态,请调用特定层或整个模型的 .reset_states()。
关于指定 RNN 初始状态的说明:您可以通过使用关键字参数 initial_state 调用 RNN 层来符号化地指定它们的初始状态。initial_state 的值应该是表示 RNN 层初始状态的张量或张量列表。
您可以通过调用 reset_states 并使用关键字参数 states 来数值地指定 RNN 层的初始状态。states 的值应该是表示 RNN 层初始状态的 numpy 数组或 numpy 数组列表。
关于将外部常量传递给 RNN 的说明:您可以通过 RNN.__call__(以及 RNN.call)方法的 constants 关键字参数传递“外部”常量给单元。这要求 cell.call 方法接受相同的关键字参数 constants。此类常量可用于根据附加的静态输入(随时间不变)来条件化单元转换,即注意力机制。
示例
from tf_keras.src.layers import RNN
from tf_keras.src import backend
# 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')
super().build(input_shape)
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)