【问题标题】:LSTM Model not having any variance during evaluationLSTM 模型在评估期间没有任何差异
【发布时间】: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


【解决方案1】:

LSTM 不是随机的。相同数据的评估结果应该相同。

【讨论】:

  • 但是,为什么第一轮和第二轮的评估结果不同呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多