如何关闭 dropout 以在 Tensorflow 中进行测试?

新手上路,请多包涵

一般来说,我对 Tensorflow 和 ML 还很陌生,所以我特此为一个(可能)微不足道的问题道歉。

我使用 dropout 技术来提高我的网络的学习率,它似乎工作得很好。然后,我想在一些数据上测试网络,看看它是否像这样工作:

    def Ask(self, image):
        return self.session.run(self.model, feed_dict = {self.inputPh: image})

显然,由于 dropout 仍然存在,每次都会产生不同的结果。我能想到的一种解决方案是创建两个单独的模型——一个用于训练,另一个用于网络的实际使用,但是,这种解决方案对我来说似乎不切实际。

解决这个问题的常用方法是什么?

原文由 G. Mesch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

最简单的方法是使用 placeholder_with_default 更改 keep_prob 参数:

 prob = tf.placeholder_with_default(1.0, shape=())
layer = tf.nn.dropout(layer, prob)

这样当你训练时你可以像这样设置参数:

 sess.run(train_step, feed_dict={prob: 0.5})

当您评估时,将使用默认值 1.0。

原文由 nessuno 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用新的 tf.estimator API 你指定一个模型函数,它根据你是在训练还是测试返回不同的模型,但仍然允许你重用你的模型代码。在你的模型函数中,你会做类似的事情:

 def model_fn(features, labels, mode):

    training = (mode == tf.estimator.ModeKeys.TRAIN)
    ...
    t = tf.layers.dropout(t, rate=0.25, training=training, name='dropout_1')
    ...

mode 参数会自动传递,具体取决于您是调用 estimator.train(...) 还是 estimator.predict(...)

原文由 Jarno 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题