如何在Tensorflow中关闭丢失测试?

时间:2017-07-07 12:56:28

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

我对Tensorflow和ML一般都是新手,所以我特此为一个(可能)微不足道的问题道歉。

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

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

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

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

6 个答案:

答案 0 :(得分:49)

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

答案 1 :(得分:8)

你应该在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

答案 2 :(得分:7)

使用新的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(...)

答案 3 :(得分:2)

如果您不想使用Estimator API,可以通过以下方式创建退出:

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}提供会话。

答案 4 :(得分:1)

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

这支持is_training参数。使用此功能,您的模型可以一次定义keep_prob,而不必依赖feed_dict来管理外部参数。这样可以提供更好的重构代码。

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

答案 5 :(得分:0)

在测试时,是否不应该将图层的输出乘以1 / drop_prob?在这种情况下,您将不得不在测试阶段增加一个乘法步骤。