如何在Tensorflow中关闭辍学测试?
conv-neural-network
machine-learning
neural-network
python
9
0

一般来说,我对Tensorflow和ML还是比较陌生,因此我对一个(可能)琐碎的问题表示歉意。

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

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

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

收藏
评论

您应该在tensorflow退出层中设置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
收藏
评论

如果您不想使用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}会话。

收藏
评论

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

根据是否调用estimator.train(...)estimator.predict(...)会自动传递mode参数。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题