【问题标题】:How to turn off dropout for testing in Tensorflow?如何在 Tensorflow 中关闭 dropout 以进行测试?
【发布时间】:2017-12-11 18:51:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python machine-learning tensorflow neural-network conv-neural-network


    【解决方案1】:

    当您测试时,您应该将层的输出乘以 1/drop_prob。

    在这种情况下,您必须在测试阶段添加一个额外的乘法步骤。

    【讨论】:

      【解决方案2】:

      随着 Tensorflow 的更新,应该使用类 tf.layer.dropout 代替 tf.nn.dropout。

      这支持 is_training 参数。使用它可以让你的模型定义一次 keep_prob,而不是依赖你的 feed_dict 来管理外部参数。这样可以更好地重构代码。

      更多信息:https://www.tensorflow.org/api_docs/python/tf/layers/dropout

      【讨论】:

        【解决方案3】:

        最简单的方法是使用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。

        【讨论】:

        • 我尝试了这种方法,但是在将“概率”分配给 tf.layers.dropout(,rate=prob,training=True) 时它给了我 NaN 错误。我使用了您建议的占位符和默认值。问题:stackoverflow.com/questions/54069395/…
        • 因为tf.nn.dropoutdrop_probability 而不是keep_probability
        【解决方案4】:

        如果你不想使用Estimator API,你可以这样创建dropout:

        tf_is_traing_pl = tf.placeholder_with_default(True, shape=())
        tf_drop_out = tf.layers.dropout(last_output, rate=0.8, training=tf.is_training_pl)
        

        因此,您在进行评估时向会话提供 {'tf_is_training': False},而不是更改退出率。

        【讨论】:

          【解决方案5】:

          使用新的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(...) 自动传递。

          【讨论】:

          • 如果我们想使用估计器的冻结图而不是保存模型怎么办?我们如何指定我们处于哪种模式?
          【解决方案6】:

          您应该在 tensorflow dropout 层中设置keep_prob,即保持权重的概率,我认为您将该变量设置为 0.5 到 0.8 之间的值。 测试网络时,您必须简单地将 keep_prob 输入 1。

          你应该这样定义:

          keep_prob = tf.placeholder(tf.float32, name='keep_prob')
          drop = tf.contrib.rnn.DropoutWrapper(layer1, output_keep_prob=keep_prob)
          

          然后更改会话中的值:

          _ = sess.run(cost, feed_dict={'input':training_set, 'output':training_labels, 'keep_prob':0.8}) # During training
          _ = sess.run(cost, feed_dict={'input':testing_set, 'output':testing_labels, 'keep_prob':1.}) # During testing
          

          【讨论】:

            猜你喜欢
            • 2020-05-10
            • 1970-01-01
            • 1970-01-01
            • 2010-10-04
            • 2018-05-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多