关于 fit() 中 validation_data 和 evaluate、predict 中进行模型预测的区别

来源:10-33 GPT与Bert与课程总结

慕斯2360121

2020-06-15

老师您好,有个问题想向您求证一下。

背景是我用 tf.Keras 构造了一个分类模型 myModel,

首先,我使用 myModel.fit() 来训练模型,并在该过程中定义了 validation_data,在训练的每个epoch后验证模型,假设这个验证模型的数据集为 eval_data(也即validation_data = eval_data),通过训练日志,我可以看到最好的模型在验证集上的acc是 91.37%

其次在训练好模型后,我通过 load_model 加载最优模型,记为 bestModel(因为在训练过程中调用 callbacks.ModelCheckpoint 中的 save_best_only=True、monitor=‘val_accuracy’,所以加载的就是训练过程中验证集acc最优的模型)。

问题出在测试阶段。我用训练过程中用于验证模型的数据 eval_data 来测试模型,也即
result = bestModel(eval_data),再经过 argmax 获取预测标签值并手动计算 acc,发现 acc 不是 91.37%,而是下降了4个百分点。

我想请问老师,训练过程中的 validation_data 自然不会用于训练模型,但从validation_data获取结果的过程 和 evaluate (或者 predict 过程)是否仍然有所不同呢?
我在模型中加入了 Dropout 机制,是否是因为 fit() 时在 validation_data 上仍然领 dropout 发挥作用,而 evaluate、predict 时令 dropout 无效,从而导致 同一模型在同一数据集上的acc不同 这一问题呢?如果不是这个原因,可能的原因可能在哪几个方面呢(我已确保数据集使一致的,并且在构造dataset时保持drop_remainder=False)

这个问题困扰我挺久,希望能从老师这里获得解答或解决的方向,感谢!

写回答

1回答

正十七

2020-06-19

我觉得可以使用排除法来判断问题所在:

  1. 首先,训练结束后直接去predict或者evaluate,看看在验证集上表现如何,排除是不是保存模型的问题。

  2. 然后,把dropout layer去掉,然后采用1的方法,看是不是dropout的问题。

另外,理论上来说,在tf.keras下使用dropout在训练和预测的时候本来就会自动有区别,(预测时候会取消dropout)。不需要我们做其他的操作。你先按照我说的方法诊断一下试试。

0
0

Google老师亲授 TensorFlow2.0 入门到进阶

Tensorflow2.0实战—以实战促理论的方式学习深度学习

1849 学习 · 896 问题

查看课程