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

G. *_*sch 26 python machine-learning neural-network conv-neural-network tensorflow

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

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

   def Ask(self, image):
        return self.session.run(self.model, feed_dict = {self.inputPh: image})
Run Code Online (Sandbox Code Playgroud)

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

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

nes*_*uno 51

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

prob = tf.placeholder_with_default(1.0, shape=())
layer = tf.nn.dropout(layer, prob)
Run Code Online (Sandbox Code Playgroud)

以这种方式训练时你可以像这样设置参数:

sess.run(train_step, feed_dict={prob: 0.5})
Run Code Online (Sandbox Code Playgroud)

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

  • 因为`tf.nn.dropout`具有`drop_probability`而不是`keep_probability` (2认同)

rob*_*isg 10

你应该设置keep_probin tensorflow dropout图层,即保持权重的概率,我认为你设置的变量值介于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)
Run Code Online (Sandbox Code Playgroud)

然后更改会话中的值:

_ = 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
Run Code Online (Sandbox Code Playgroud)


Jar*_*rno 9

使用新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')
    ...
Run Code Online (Sandbox Code Playgroud)

mode参数取决于你是否调用自动传递estimator.train(...)estimator.predict(...).