Выходные данные загруженной модели Keras отличаются от выходных данных модели обучения
Когда я обучаю свою модель, она имеет двумерный вывод - он (нет, 1) - соответствует временному ряду, который я пытаюсь предсказать. Но всякий раз, когда я загружаю сохраненную модель, чтобы делать прогнозы, она дает трехмерный результат - (none, 40, 1) - где 40 соответствует n_steps, необходимым для соответствия сети conv1D. Что случилось?
Вот код:
df = np.load('Principal.npy')
# Conv1D
#model = load_model('ModeloConv1D.h5')
model = autoencoder_conv1D((2, 20, 17), n_steps=40)
model.load_weights('weights_35067.hdf5')
# summarize model.
model.summary()
# load dataset
df = df
# split into input (X) and output (Y) variables
X = f.separar_interface(df, n_steps=40)
# THE X INPUT SHAPE (59891, 17) length and attributes, respectively ##
# conv1D input format
X = X.reshape(X.shape[0], 2, 20, X.shape[2])
# Make predictions
test_predictions = model.predict(X)
## test_predictions.shape = (59891, 40, 1)
test_predictions = model.predict(X).flatten()
##test_predictions.shape = (2395640, 1)
plt.figure(3)
plt.plot(test_predictions)
plt.legend('Prediction')
plt.show()
На графике ниже вы можете видеть, что он отображает формат ввода.
Вот архитектура сети:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
time_distributed_70 (TimeDis (None, 1, 31, 24) 4104
_________________________________________________________________
time_distributed_71 (TimeDis (None, 1, 4, 24) 0
_________________________________________________________________
time_distributed_72 (TimeDis (None, 1, 4, 48) 9264
_________________________________________________________________
time_distributed_73 (TimeDis (None, 1, 1, 48) 0
_________________________________________________________________
time_distributed_74 (TimeDis (None, 1, 1, 64) 12352
_________________________________________________________________
time_distributed_75 (TimeDis (None, 1, 1, 64) 0
_________________________________________________________________
time_distributed_76 (TimeDis (None, 1, 64) 0
_________________________________________________________________
lstm_17 (LSTM) (None, 100) 66000
_________________________________________________________________
repeat_vector_9 (RepeatVecto (None, 40, 100) 0
_________________________________________________________________
lstm_18 (LSTM) (None, 40, 100) 80400
_________________________________________________________________
time_distributed_77 (TimeDis (None, 40, 1024) 103424
_________________________________________________________________
dropout_9 (Dropout) (None, 40, 1024) 0
_________________________________________________________________
dense_18 (Dense) (None, 40, 1) 1025
=================================================================
1 ответ
Когда я обнаружил свою ошибку и думаю, что она может быть полезна для кого-то еще, я отвечу на свой вопрос: на самом деле сетевой вывод имеет тот же формат, что и метки обучающего набора данных. Это означает, что сохраненная модель генерирует выходные данные с формой (None, 40, 1), поскольку это точно такая же форма, которую вы (я) придали меткам результатов обучения.
Вы (то есть я) цените разницу между сетевым выводом во время обучения и сетевым выводом при прогнозировании, потому что вы, скорее всего, используете такой метод, как train_test_split во время обучения, который рандомизирует сетевой вывод. Таким образом, в конце обучения вы видите производство этой рандомизированной партии.
Чтобы исправить вашу проблему (мою проблему), вы должны изменить форму меток набора данных с (Нет, 40, 1) на (Нет, 1), поскольку у вас есть проблема регрессии для временного ряда. Чтобы исправить это в вашей вышеупомянутой сети, вам лучше установить плоский слой перед плотным выходным слоем. Поэтому я получу результат, который вы ищете.