Я пытаюсь использовать автоэнкодер, чтобы получить временной ряд и восстановить его. Мои данные имеют 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-й на картинке. Интересно, почему?