Как работает этот автоэнкодер?

Я пытаюсь использовать автоэнкодер, чтобы получить временной ряд и восстановить его. Мои данные имеют 10 временных рядов длиной 365 и одним измерением с окном обзора в 28 дней. Модель Autoencoder основана на этом блоге keras. Таким образом, в основном эта модель должна получить последовательность из 28 значений и попытаться восстановить их в результате. Как вы можете видеть в коде, я обучил модель, а затем дал ей 100 последовательностей в качестве теста. Затем я попытался отобразить полученное значение для каждого шага последовательности (см. рисунок). Я хочу посмотреть, как построен каждый из этих 28 временных шагов. Таким образом, на рисунке вы можете увидеть 28 графиков для каждого из них (синяя линия — это реальное/ожидаемое значение, а оранжевая линия — реконструированный результат). Для первого временного шага это всегда плохое и почти постоянное значение, затем оно становится все лучше и лучше для следующих временных шагов, а для последнего оно почти способно восстановить реальное значение. Как это происходит? Я ожидал увидеть примерно одинаковую картину для всех временных интервалов. Как вы интерпретируете эти графики и то, как здесь работает Autoencoder?

seq_len = 28
n_features = 1
enc_hunits = 14
data.shape = (5642, 28, 1)

inputEncoder = Input(shape=(seq_len, n_features), name='inputEncoder')
outEncoder = LSTM(enc_hunits, name='outputEncoder')(inputEncoder)
encoder_model = Model(inputEncoder, outEncoder)

c = RepeatVector(seq_len/enc_hunits, name='inputDecoder')(outEncoder)
c_reshaped = Reshape((seq_len, n_features), name='ReshapeLayer')(c)

outDecoder = LSTM(1, return_sequences=True, name='decoderLSTM')(c_reshaped)
autoencoder = Model(inputEncoder, outDecoder)

autoencoder.compile(loss='mse', optimizer='rmsprop')
history = autoencoder.fit(data, data,
                          validation_split=validation_split_ratio,
                          epochs=epochs,
                          )

test = data[:100, :, :]  # get 100 examples from training
result = autoencoder.predict(test)
#....
plot_results(test, result, n_ts=seq_len)


def plot_results(exp, rec, n_ts=28):
    fig = pyplot.figure(figsize=(30, 30))
    fig.subplots_adjust(hspace=0.32, wspace=0.15)
    count = 1
    for irow in range(n_ts):
        ax = fig.add_subplot(n_ts/2, 2, count)
        ax.plot(exp[:, irow], "--", marker='o', label="Input")
        ax.plot(rec[:, irow], marker='o', label="Reconstructed", linewidth=3, alpha=0.5)
        ax.set_title("{:}th timestep".format(irow))
        ax.legend()
        count += 1
    pyplot.legend()
    pyplot.savefig("all_timesteps.png")
    pyplot.clf()

ОБНОВЛЕНИЕ: Какая разница, если я удалю строку Reshape и заставлю RepeatVector выполнять повторение только для seq_len раз, например: c = RepeatVector(seq_len, name='inputDecoder')(outEncoder) . Так что в моем случае он будет повторять вектор 28 раз вместо 2 раз. Как это повлияет на ввод декодера? Я попробовал это и снова построил все временные интервалы, и на этот раз ни один из временных шагов не реконструирован правильно. Первый сюжет такой же, как первый сюжет на картинке здесь, а остальные почти такие же, как 2-й на картинке. Интересно, почему?

введите здесь описание изображения


person Birish    schedule 20.07.2018    source источник


Ответы (1)


Автоэнкодер использует 28 временных шагов для прогнозирования.

seq_length = 28

На вашем 0-м временном интервале доступен только этот временной шаг. это то, что вызывает результаты, которые вы видите.

В идеале вы должны начать прогнозировать временные шаги после 27-го числа, чтобы автоэнкодер имел полную длину последовательности для прогнозирования.

person VegardKT    schedule 20.07.2018
comment
В чем будет разница, если я удалю строку Reshape и заставлю RepeatVector выполнять повтор только для seq_len раз, например: c = RepeatVector(seq_len, name='inputDecoder')(outEncoder) . Так что в моем случае он будет повторять вектор 28 раз вместо 2 раз. Как это повлияет на ввод декодера? Я попробовал это и снова построил все временные интервалы, и на этот раз ни один из временных шагов не реконструирован правильно. Первый сюжет такой же, как первый сюжет на картинке здесь, а остальные почти такие же, как 2-й на картинке. интересно, почему - person Birish; 20.07.2018