我对Tensorflow和ML一般都是新手,所以我特此为一个(可能)微不足道的问题道歉。
我使用辍学技术来提高网络的学习率,似乎工作得很好。然后,我想测试网络上的一些数据,看它是否像这样:
def Ask(self, image):
return self.session.run(self.model, feed_dict = {self.inputPh: image})
显然,每次丢失仍然存在时,它会产生不同的结果。我能想到的一个解决方案是创建两个独立的模型 - 一个用于培训,另一个用于以后实际使用网络,但是,这样的解决方案对我来说似乎不切实际。
解决此问题的常用方法是什么?
答案 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?在这种情况下,您将不得不在测试阶段增加一个乘法步骤。