По договоренности
Необходимо объяснить принцип формирования рекуррентного слоя принимающего на вход вектор (не последовательность векторов), выдающий последовательность векторов на выходе. И как чуть более сложная задача рекуррентная сеть many-to-many с последовательностями на входе и выходе разной длины. На примере keras.
В обоих случаях получаю ошибку различной длины последовательности.
Пример 1.
Нужно подать на вход вектор длиной 2 (не последовательность), т.е. есть три входных образца x[0],x[1],x[2].
На выходе получаю последовательности 3 раза по 1 значению. 1) y[0][0],y[0][1],y[0][2]; 2)y[1][0],y[1][1],y[1][2];
3) y[2][0],y[2][1],y[2][2]
x = [[1,2],[3,4],[4,5]]
y=[[1,2,3],[1,2,3],[1,2,3]]
x = np.array(x)
y = np.array(y)
input = Input(input_shape=(1,2))
model = SimpleRNN(1, stateful=True, return_state=False,return_sequences=True)(input)
output = Dense(1)(model)
test = Model(input, output)
test.compile(loss='mse', optimizer='adam')
test.fit(x,y)
Пример 2.
many-to-many, такой что вход и выход различной длины
На вход подаю последовательность из 10ти значений размерностью 1,
на выходе ожидаю последовательность из 20ти значений размерностью 1
input_shape=(None, 1)
model_input = Input(shape=input_shape)
rnn = LSTM(20, return_sequences=False)(model_input)
dense = Dense(10,activation='tanh')(rnn)
input_shape2=(None, 1, 10)
model_input2 = Input(shape=input_shape2)
rnn2 = LSTM(20, return_sequences=True,stateful=True)(model_input2)
dense2 = Dense(1,activation='sigmoid')(rnn2)
encoder = keras.Model(model_input, dense, name="encoder")
decoder = keras.Model(model_input2, dense2, name="decoder")
model = keras.Model(model_input, decoder(encoder(model_input)), name="autoencoder")
model.compile(optimizer='adam', loss='binary_crossentropy')