我想在Keras中实现一对多RNN,每个时间步都接受相同的输入:
我可以简单地在时间维度上重复输入x(即,对于所有t,x_ {t} = x),但是这将导致内存使用效率低下,并且当x和时间步数同时出现时,可能会出现问题很大
例如,假设我想让RNN简单地累加(求和)输入x(每个时间步都相同)。为简单起见,假设输入,隐藏层和输出均为标量。以下代码实现了该RNN并在三个时间步上运行它,但它利用RepeatVector来(无效地)跨时域复制输入。
class AccumulationRNN(keras.layers.Layer):
def __init__(self, **kwargs):
self.state_size = [1,]
super(AccumulationRNN, self).__init__(**kwargs)
def call(self, x, state):
# Example functionality, not what I actually want to do.
state = state[0] + x
output = state
return output, state
# Create an input of ones.
x = tf.ones((1,1)) # shape: (BATCH_SIZE=1, 1)
# Repeat x over the temporal dimension. This is the memory-inefficient step.
x_repeated = keras.layers.RepeatVector(3)(x) # shape: (BATCH_SIZE=1, TIMESTEPS=3, 1)
keras.layers.RNN(AccumulationRNN(), return_sequences=True)(x_repeated)
<tf.Tensor: shape=(1, 3, 1), dtype=float32, numpy=
array([[[1.],
[2.],
[3.]]], dtype=float32)>
这是预期的结果,但是有没有一种方法可以不重复x?
(我想这种RNN在注意力机制中非常普遍,例如x是高分辨率图像,而隐藏层则在每个时间步上对该图像进行不同的裁剪,然后对其进行其他处理。)