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=2
s previsões param de rastrear os alvos tão de perto, mas o padrão geral de inversão ainda permanec