Я хотел бы реализовать RNN «один ко многим» в Keras, который принимает один и тот же вход на каждом временном шаге:

Я мог бы просто повторить ввод x во временном измерении (то есть x_ {t} = x для всех t), но это будет неэффективным использованием памяти и может стать проблематичным c, когда и 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)>
Это ожидаемый результат , но есть ли способ сделать это без повторения х?
(Я полагаю, что этот вид RNN довольно распространен в механизмах внимания, где x представляет собой, например, изображение с высоким разрешением, а скрытый слой обрезает это изображение по-разному на каждом временном шаге и выполняет некоторую другую обработку она.)