【发布时间】:2021-01-28 12:39:12
【问题描述】:
我有一个关于 LSTM 模型评估的问题。我已经训练了一个 LSTM 模型并将其存储在 model.save(...) 中。现在我想要 load_model 并在验证集数据集上对其进行评估。由于神经网络是随机的,我多次运行它并计算我感兴趣的不同指标的均值和方差。
现在我很震惊,在第一次运行之后,所有连续运行在每个指标上都具有相同的性能。我认为这是不对的,但我不知道错误发生在哪里。
所以我的问题是:
我在设置模型验证时有什么错误?
我该如何解决?
这里是应该解释我在做什么的代码 sn-ps:
编译并拟合模型
def compile_and_fit( hparams,
MAX_EPOCHS,
model_path ):
window = WindowGenerator( input_width= hparams[HP_WINDOW_SIZE],
label_width=hparams[HP_WINDOW_SIZE], shift=1,
label_columns=['q_MARI'], batch_size = hparams[HP_BATCH_SIZE])
model = tf.keras.models.Sequential([
tf.keras.layers.LSTM(hparams[HP_NUM_UNITS], return_sequences=True, name="LSTM_1"),
tf.keras.layers.Dropout(hparams[HP_DROPOUT], name="Dropout_1"),
tf.keras.layers.LSTM(hparams[HP_NUM_UNITS], return_sequences=True, name="LSTM_2"),
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(1))
])
learning_rate = hparams[HP_LEARNING_RATE]
model.compile(loss=tf.losses.MeanSquaredError(),
optimizer=tf.optimizers.Adam(learning_rate=learning_rate),
metrics=get_metrics())
history = model.fit(window.train,
epochs=MAX_EPOCHS,
validation_data=window.val,
callbacks= get_callbacks(model_path))
_, a,_,_,_,_ = model.evaluate(window.val)
return a, model, history
训练并保护它
a, model, history = compile_and_fit( hparams = hparams, MAX_EPOCHS = MAX_EPOCHS, model_path = run_path)
model.save(run_path)
加载并评估它
model = tf.keras.models.load_model(os.path.join(hparam_path, model_name),
custom_objects={"max_error": max_error, "median_absolute_error": median_absolute_error, "rev_metric": rev_metric, "nse_metric": nse_metric})
model.compile(loss=tf.losses.MeanSquaredError(), optimizer="adam", metrics=get_metrics())
metric_values = np.empty(shape = (nr_runs, len(metrics)), dtype=float)
for j in range(nr_runs):
window = WindowGenerator(input_width= hparam_vals[i], label_width=hparam_vals[i], shift=1,
label_columns=['q_MARI'])
metric_values[j]= np.array(model.evaluate(window.val))
means = metric_values.mean(axis=0)
varis = metric_values.var(axis=0)
print(f'means: {means}, varis: {varis}')
为了设置培训,我遵循以下两个指南: https://www.tensorflow.org/tutorials/structured_data/time_series https://www.tensorflow.org/tensorboard/hyperparameter_tuning_with_hparams
【问题讨论】:
-
LSTM 不是随机的
-
如果你保存权重然后使用这些权重来预测数据,你每次都会得到相同的答案。唯一具有随机性的是您的训练过程——生成权重的行为。
标签: python tensorflow machine-learning keras lstm