ede @Keras produzindo previsões inversas

Tenho um conjunto de dados de séries temporais e estou tentando treinar uma rede para que ela overfits (obviamente, esse é apenas o primeiro passo, então lutarei contra o sobreajuste

A rede possui duas camadas: LSTM (32 neurônios) e Denso (1 neurônio, sem ativação)

O treinamento / modelo possui estes parâmetros:epochs: 20, steps_per_epoch: 100, loss: "mse", optimizer: "rmsprop".

TimeseriesGenerator produz a série de entrada com:length: 1, sampling_rate: 1, batch_size: 1.

Eu esperava que a rede memorizasse um conjunto de dados tão pequeno (tentei uma rede ainda mais complicada sem sucesso) e a perda no conjunto de dados de treinamento seria praticamente zero. Não é e quando visualizo os resultados noTreinament definido assim:

y_pred = model.predict_generator(gen)
plot_points = 40
epochs = range(1, plot_points + 1)
pred_points = numpy.resize(y_pred[:plot_points], (plot_points,))
target_points = gen.targets[:plot_points]
plt.plot(epochs, pred_points, 'b', label='Predictions')
plt.plot(epochs, target_points, 'r', label='Targets')
plt.legend()
plt.show()

Eu recebo

As previsões têm amplitude um pouco menor, mas sãoprecisely inverso para os alvos. Btw. isso não é memorizado, eles são invertidos mesmo para o conjunto de dados de teste no qual o algoritmo não treinou. Parece que, em vez de memorizar o conjunto de dados, minha rede aprendeu a negar o valor de entrada e reduzi-lo levemente. Alguma idéia de por que isso está acontecend Não parece a solução para a qual o otimizador deveria ter convergido (a perda é bem grande

EDIT (algumas partes relevantes do meu código):

train_gen = keras.preprocessing.sequence.TimeseriesGenerator(
        x,
        y,
        length=1,
        sampling_rate=1,
        batch_size=1,
        shuffle=False
    )

model = Sequential()
model.add(LSTM(32, input_shape=(1, 1), return_sequences=False))
model.add(Dense(1, input_shape=(1, 1)))

model.compile(
    loss="mse",
    optimizer="rmsprop",
    metrics=[keras.metrics.mean_squared_error]
)

history = model.fit_generator(
    train_gen,
    epochs=20,
    steps_per_epoch=100
)

EDIT (conjunto de dados diferente gerado aleatoriamente):

Eu tive que aumentar o número de neurônios LSTM para 256, com a configuração anterior (32 neurônios), a linha azul era praticamente plana. No entanto, com o aumento, surge o mesmo padrão -redições inversas com amplitude um pouco men.

EDIT (metas alteradas em +1):

Mudar os alvos por um em comparação com as previsões não produz um ajuste muito melhor. Observe as partes destacadas em que o gráfico não está apenas alternando, é mais evidente lá.

EDIT (comprimento aumentado para 2 ...TimeseriesGenerator(length=2, ...)):

Withlength=2s previsões param de rastrear os alvos tão de perto, mas o padrão geral de inversão ainda permanec

questionAnswers(2)

yourAnswerToTheQuestion