RNN
类keras.layers.RNN(
cell,
return_sequences=False,
return_state=False,
go_backwards=False,
stateful=False,
unroll=False,
zero_output_for_mask=False,
**kwargs
)
循环层的基类。
参数
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。False
)。是否返回输出序列中的最后一个输出,或返回完整的序列。False
)。是否除了输出之外还返回最后一个状态。False
)。如果为 True
,则反向处理输入序列并返回反转后的序列。False
)。如果为 True,则批次中索引为 i
的每个样本的最后一个状态将用作后续批次中索引为 i
的样本的初始状态。False
)。如果为 True,则网络将被展开,否则将使用符号循环。展开可以加速 RNN,尽管它往往会更占用内存。展开仅适用于短序列。False
)。输出是否应为屏蔽时间步使用零。请注意,此字段仅在 return_sequences
为 True
且提供了 mask
时使用。如果您希望重用 RNN 的原始输出序列而不受屏蔽时间步的影响(例如,合并双向 RNN),则它会很有用。调用参数
(batch_size, timesteps, features)
的 3D 张量。[batch_size, timesteps]
的二进制张量,指示是否应该屏蔽给定的时间步。单个 True
条目表示应使用相应的时间步,而 False
条目表示应忽略相应的时间步。输出形状
return_state
:张量列表。第一个张量是输出。其余张量是最后一个状态,每个状态的形状为 (batch_size, state_size)
,其中 state_size
可以是高维张量形状。return_sequences
:形状为 (batch_size, timesteps, output_size)
的 3D 张量。掩码
此层支持对具有可变时间步数的输入数据进行掩码。要将掩码引入您的数据,请使用具有 mask_zero
参数设置为 True
的 keras.layers.Embedding
层。
关于在 RNN 中使用状态性的说明
您可以将 RNN 层设置为“有状态”,这意味着为一个批次中的样本计算的状态将被重复用作下一个批次中样本的初始状态。这假设不同连续批次中的样本之间存在一对一映射。
要启用状态性
stateful=True
。batch_size=...
传递给模型的 Input
层。请记住,在调用 fit()
时也要指定相同的 batch_size=...
,否则使用类似生成器的的数据源,例如 keras.utils.PyDataset
或 tf.data.Dataset
。fit()
时指定 shuffle=False
,因为您的批次预计是按时间顺序排列的。要重置模型的状态,请在特定层或整个模型上调用 .reset_state()
。
关于指定 RNN 初始状态的说明
您可以通过使用关键字参数 initial_state
调用 RNN 层来象征性地指定 RNN 层的初始状态。initial_state
的值应为表示 RNN 层初始状态的张量或张量列表。
您可以通过使用关键字参数 states
调用 reset_state()
来以数值方式指定 RNN 层的初始状态。states
的值应为表示 RNN 层初始状态的 NumPy 数组或 NumPy 数组列表。
示例
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')
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]
# 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)