(см. мое последнее редактирование), и общая картина остается прежней, хотя прогнозы выглядят немного иначе.

я есть набор данных временных рядов, и я пытаюсь обучить сеть так, чтобы онаoverfits (очевидно, это только первый шаг, я буду бороться с переоснащением).

Сеть имеет два уровня: LSTM (32 нейрона) и Dense (1 нейрон, без активации).

Тренинг / модель имеет следующие параметры:epochs: 20, steps_per_epoch: 100, loss: "mse", optimizer: "rmsprop".

TimeseriesGenerator производит входные серии с:length: 1, sampling_rate: 1, batch_size: 1.

Я ожидал бы, что сеть просто запомнит такой маленький набор данных (я пробовал даже гораздо более сложную сеть безрезультатно), и потери на обучающем наборе данных были бы почти нулевыми. Это не так, и когда я представляю результаты натренировка установить так:

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()

Я получил:

Прогнозы имеют несколько меньшую амплитуду, ноточно обратный к целям. Btw. это не запоминается, они инвертируются даже для тестового набора данных, который алгоритм не обучил вообще. Похоже, что вместо запоминания набора данных моя сеть только что научилась отрицать входное значение и немного уменьшать его.Есть идеи, почему это происходит? Не похоже, что решение, к которому оптимизатор должен был сойтись (потери довольно большие).

РЕДАКТИРОВАТЬ (некоторые соответствующие части моего кода):

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
)

РЕДАКТИРОВАТЬ (другой, случайно сгенерированный набор данных):

Мне пришлось увеличить количество нейронов LSTM до 256, с предыдущей настройкой (32 нейрона) синяя линия была почти плоской. Тем не менее, с увеличением возникает та же картина -обратные предсказания с несколько меньшей амплитудой.

РЕДАКТИРОВАТЬ (цели смещены на +1):

Смещение целей на единицу по сравнению с предсказаниями не дает намного лучшего соответствия. Обратите внимание на выделенные части, где график не просто чередуется, он более заметен.

РЕДАКТИРОВАТЬ (увеличена длина до 2 ...TimeseriesGenerator(length=2, ...)):

С участиемlength=2 предсказания перестают так близко отслеживать цели, но общая картина инверсии остается неизменной.

Ответы на вопрос(2)

Ваш ответ на вопрос