目录
RNN
keras.layers.RNN(cell, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)
循环神经网络层基类。
参数
- cell: 一个 RNN 单元实例。RNN 单元是一个具有以下项目的类:
一个call(input_at_t, states_at_t)
方法, 它返回(output_at_t, states_at_t_plus_1)
。 单元的调用方法也可以采用可选参数constants
, 详见下面的小节 “关于传递外部常量的注意事项”。
一个state_size
属性。这可以是单个整数(单个状态), 在这种情况下,它是循环层状态的大小(应该与单元输出的大小相同)。 这也可以是整数的列表/元组(每个状态一个大小)。 在这种情况下,第一项(state_size [0])
应该与单元输出的大小相同。 cell 也可能是 RNN 单元实例的列表,在这种情况下,RNN 的单元将堆叠在另一个单元上,实现高效的堆叠 RNN。 - return_sequences: 布尔值。是返回输出序列中的最后一个输出,还是全部序列。
- return_state: 布尔值。除了输出之外是否返回最后一个状态。
go_backwards: 布尔值 (默认 False)。 如果为 True,则向后处理输入序列并返回相反的序列。 - stateful: 布尔值 (默认 False)。 如果为 True,则批次中索引 i 处的每个样品的最后状态将用作下一批次中索引 i 样品的初始状态。
unroll: 布尔值 (默认 False)。 如果为 True,则网络将展开,否则将使用符号循环。 展开可以加速 RNN,但它往往会占用更多的内存。 展开只适用于短序列。 - input_dim: 输入的维度(整数)。 将此层用作模型中的第一层时,此参数(或者,关键字参数 input_shape)是必需的。
- input_length: 输入序列的长度,在恒定时指定。 如果你要在上游连接 Flatten 和 Dense 层, 则需要此参数(如果没有它,无法计算全连接输出的尺寸)。 请注意,如果循环神经网络层不是模型中的第一层, 则需要在第一层的层级指定输入长度(例如,通过 input_shape 参数)。
输入尺寸
3D 张量,尺寸为 (batch_size, timesteps, input_dim)。
输出尺寸
如果 return_state 为 True,则返回张量列表。 第一个张量为输出。剩余的张量为最后的状态, 每个张量的尺寸为 (batch_size, units)。
否则,返回尺寸为 (batch_size, units) 的 2D 张量。
屏蔽覆盖
该层支持以可变数量的时间步长对输入数据进行屏蔽覆盖。 要将屏蔽引入数据,请使用 Embedding 层, 并将mask_zero 参数设置为 True。
关于在 RNN 中使用状态的注意事项
你可以将 RNN 层设置为 stateful(有状态的), 这意味着针对一批中的样本计算的状态将被重新用作下一批样品的初始状态。 这假定在不同连续批次的样品之间有一对一的映射。
为了使状态有效: - 在层构造器中指定 stateful=True。 - 为你的模型指定一个固定的批次大小, 如果是顺序模型,为你的模型的第一层传递一个 batch_input_shape=(…) 参数。 - 为你的模型指定一个固定的批次大小, 如果是顺序模型,为你的模型的第一层传递一个 batch_input_shape=(…)。 如果是带有 1 个或多个 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 数组列表。
关于给 RNN 传递外部常量的注意事项
你可以使用 RNN.call(以及 RNN.call)的 constants 关键字参数将「外部」常量传递给单元。 这要求 cell.call 方法接受相同的关键字参数 constants。 这些常数可用于调节附加静态输入(不随时间变化)上的单元转换,也可用于注意力机制。
例子
# 首先,让我们定义一个 RNN 单元,作为网络层子类。
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 = K.dot(inputs, self.kernel)
output = h + K.dot(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)