TensorFlow:如何在不使用feed_dict的情况下更改Dropout的keep_prob

时间:2017-09-10 13:56:14

标签: tensorflow regularized

我构建了一个TensorFlow模型,该模型适用于输入队列提供的训练和测试批处理。因此,我没有明确地使用标准feed_dict提供训练数据。不过,我需要实现dropout,这需要keep_prob占位符来在测试期间关闭dropout。

如果没有单独的模型,我找不到如何解决这个问题。有什么建议吗?

由于

2 个答案:

答案 0 :(得分:0)

假设您的张量 layer1 定义如下:

layer1 = tf.nn.relu(tf.matmul(w,x)+b)

申请辍学,您只需

dropout_layer1 = tf.nn.dropout(layer1, keep_prob)

你的keep_prob被定义在哪里,我通常用FLAGS控制它,但是你可以在程序中使用正常的声明。然后,您可以使用dropout_layer1作为正常张量。这里有一个关于使用它的简单示例:

import tensorflow as tf
import numpy as np
tf.reset_default_graph()

keep_prob = 0.5

a = tf.get_variable('a', initializer=np.random.normal())
b = tf.get_variable('b', initializer=np.random.normal())

x=[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.]
y=list(map(lambda i: i+np.random.normal(0, 0.1), x))
f=tf.multiply(x,a)+b
f_dropout = tf.nn.dropout(f,keep_prob)

loss = tf.reduce_sum(tf.pow(f_dropout-y, 2))
train = tf.train.GradientDescentOptimizer(0.001).minimize(loss)

sess = tf.Session() #
init = tf.global_variables_initializer()
sess.run(init)

for i in range(1000):
    _, l, slope, intercept = sess.run([train, loss, a, b])
    print(list(map(lambda i: i*slope+intercept, x)))
    print('a: %.2f' %slope)
    print('b: %.2f' %intercept)

从回归的角度来看,这是一个不好的例子,但它显示了如何编程辍学,并且很容易推断辍学的情况。我希望你会喜欢它:)。

答案 1 :(得分:0)

我的问题已经过时,我太复杂了。

即使存在直接提供训练示例的输入队列,仍然可以在调用sess.run()时通过feed_dict向占位符提供值。