Keras自定义RNN图层在每个时间步均具有相同的输入

时间:2020-01-24 04:24:27

标签: python tensorflow keras

我想在Keras中实现一对多RNN,每个时间步都接受相同的输入:

Text

我可以简单地在时间维度上重复输入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是高分辨率图像,而隐藏层则在每个时间步上对该图像进行不同的裁剪,然后对其进行其他处理。)

0 个答案:

没有答案