【问题标题】:Keras and Tensorflow with identical weights but different test accuracy权重相同但测试精度不同的 Keras 和 Tensorflow
【发布时间】:2017-07-28 14:36:41
【问题描述】:

我已经训练了一个 Tensorflow 模型,然后构建了它的等效 Keras 模型并将学习到的权重加载到其中。 但是,我在 Keras 中得到了不同的测试准确度(例如,Tensorflow 中的 98.5% 与 98% 相比)。 我以这种方式定义了 tensorflow 的准确性:

accuracy = tf.cast(tf.equal(tf.argmax(input_labels, 1), tf.argmax(output, 1)), tf.float32)

在 Keras 中,我使用了它的标准度量:

model.compile(optimizer=tf.train.AdamOptimizer(), loss='categorical_crossentropy', metrics=['accuracy'])

accuracy = model.evaluate(x=test_images, y=test_labels, batch_size=BATCH_SIZE)

我很困惑这种差异来自哪里。

编辑: 由于我不相信答案,所以我在代码上花了几天的时间,直到我发现了一个导致这种差异的错误,并且在修复它之后,两个框架现在产生了与预期相同的权重相同的结果。 我正在编写此编辑以防止其他读者混淆,因为 Stackoverflow 不允许我删除问题。

【问题讨论】:

  • 如果您对当前答案不满意,您可以/应该做的是发布您自己的答案。这比将答案编辑到问题中要好。不过,请确保您的回答说明了如何您修复了错误/差异。 (回答自己的问题总是可以的——事实上,我们鼓励这样做!)

标签: tensorflow keras


【解决方案1】:

一个可能的原因:你的模型中有一个 dropout 层。

根据the source code,内部随机逻辑由tf.random_uniform实现,每次调用sess.run()都会随机生成一个新值。

【讨论】:

  • 是的,你是对的,有一个dropout层。但我认为所有 dropout 层在测试阶段都变得确定,并且所有节点都已打开,因此不应该有任何随机性。有错吗?
  • 我删除了 dropout 层,但在 keras 和 tensorflow 中仍然得到不同的精度。然而,现在 Keras 的准确率要低得多(例如,在 keras 中为 70%,而在 tensorflow 中为 90%)。还是不知道是什么原因造成的。
  • 我刚刚为您的第一个评论更新了我的答案,对于第二个评论,它看起来很奇怪,也许您可​​以发布有关您的模型的更多信息。 @Monaj
  • 感谢您的回复,如果我错了,请纠正我。我仍然认为tf.tandom_uniform 在训练阶段发挥作用。训练完成后,一切都变得确定,在测试时,所有神经元都开启并通过已经学习的权重生效。
  • @Monaj 不,tf 会为训练和测试短语随机生成这个值,因为它不是在 dropout 层中训练的变量。
猜你喜欢
  • 2020-05-23
  • 2018-11-29
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2018-02-17
  • 2018-09-28
  • 2018-01-18
  • 2019-01-03
相关资源
最近更新 更多