【问题标题】:How can I rerun validation on a saved model in Keras如何在 Keras 中对保存的模型重新运行验证
【发布时间】:2017-09-24 06:09:37
【问题描述】:

我有一个 Keras 神经网络,每当模型超过之前的验证分数时,我就使用 checkpoint 回调来保存模型。

我可以很容易地使用

重新加载模型
model = keras.models.load_model("savedcheckpointfilename.h5")

然后我想从保存模型之前的最后一个 epoch 中提取 lossval_loss 值。

我该怎么做?

我已尝试运行另一个训练阶段,但我想这会改变权重。我不确切知道使用了什么验证集,因为 Keras 在训练期间会自动执行此操作,因此看不到我如何运行显式预测与验证数据(因为训练集的哪一部分保留用于验证没有暴露 AFAICS )。

【问题讨论】:

  • 经过一番挖掘,看起来我可以保存从 fit 函数返回的历史记录以至少查看历史记录,但我仍然希望能够重新评估验证。看起来历史对象也将验证数据存储在验证字段中,但不清楚如何将其传递给预测/评估。
  • 不知道验证数据是什么;我将一个训练集和一个 validation_split (0.1) 传递给 Keras 的 fit() 函数。从理论上讲,我可以使用 fit 的 validation_data 参数传入我自己的 validation_data ,但是在 Windows 上有一个错误,这不起作用,因此使用 validation_data 而不是 validation_split 对我来说不是一个可行的解决方法。我将尝试挖掘该错误的参考,无论哪种方式,在使用 validation_split 方法时如何重新评估验证损失都是一个合法问题。

标签: validation neural-network keras


【解决方案1】:

Keras 似乎将数据的最后一部分作为验证拆分。

因此,如果您使用在 model.fit(... validation_split= <your ratio here>) 中定义的完全相同的值手动拆分训练数据,您可以随时获取验证数据并使用它执行简单的 model.evaluate()

我刚刚使用Pima Indians Example 进行了验证,它可以正常工作:

训练:纪元 1/1 250/250 - 0s - 损失:val_loss:0.6712 - val_acc:0.6560

模型评估通过手动拆分完成 - ETA:0s _ loss:0.6712% _ acc:0.6560%

如果分割点不在整数边界上,则需要四舍五入。

def checkValScore(modelFile, X_train, Y_train, split=0.1) :

    model = keras.models.load_model(modelFile)
    split =  -int(math.ceil(X_train.shape[0]* split))
    X_cv = np.array(X_train)[split:]
    Y_cv = np.array(Y_train)[split:]
    return model.evaluate(X_cv, Y_cv)

【讨论】:

  • 谢谢! - 这适用于您需要将验证集分数向上舍入(如果它不在整数边界上)的小警告。我已经编辑了你的答案以反映这一点,如果你没问题,我会标记它好。
  • @TomWalker 太好了。很高兴你能解决它!当然:感谢您的编辑,很好。
猜你喜欢
  • 1970-01-01
  • 2018-05-02
  • 2022-07-25
  • 2019-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多