我试图在tensorflow中使用dropout功能:
sess=tf.InteractiveSession()
initial = tf.truncated_normal([1,4], stddev=0.1)
x = tf.Variable(initial)
keep_prob = tf.placeholder("float")
dx = tf.nn.dropout(x, keep_prob)
sess.run(tf.initialize_all_variables())
sess.run(dx, feed_dict={keep_prob: 0.5})
sess.close()
这个例子与它在中的表现方式非常相似;但是,我最终得到以下错误:
RuntimeError: min: Conversion function <function constant at 0x7efcc6e1ec80> for type <type 'object'> returned incompatible dtype: requested = float32_ref, actual = float32
我很难理解dtype float32_ref
,这似乎是问题的背景。我还试图指定dtype=tf.float32
,但这并没有解决任何问题。
我也尝试过这个示例,它适用于float32
:
sess=tf.Session()
x=tf.Variable(np.array([1.0,2.0,3.0,4.0]))
sess.run(x.initializer)
x=tf.cast(x,tf.float32)
prob=tf.Variable(np.array([0.5]))
sess.run(prob.initializer)
prob=tf.cast(prob,tf.float32)
dx=tf.nn.dropout(x,prob)
sess.run(dx)
sess.close()
但是,如果我转换float64
而不是float32
,我会得到同样的错误:
RuntimeError: min: Conversion function <function constant at 0x7efcc6e1ec80> for type <type 'object'> returned incompatible dtype: requested = float64_ref, actual = float64
修改
似乎这个问题只出现在直接在变量上使用dropout,适用于占位符以及变量和占位符的产品时,例如:
sess=tf.InteractiveSession()
x = tf.placeholder(tf.float64)
sess=tf.InteractiveSession()
initial = tf.truncated_normal([1,5], stddev=0.1,dtype=tf.float64)
y = tf.Variable(initial)
keep_prob = tf.placeholder(tf.float64)
dx = tf.nn.dropout(x*y, keep_prob)
sess.run(tf.initialize_all_variables())
sess.run(dx, feed_dict={x : np.array([1.0, 2.0, 3.0, 4.0, 5.0]),keep_prob: 0.5})
sess.close()
答案 0 :(得分:8)
这是tf.nn.dropout
实现中的错误,该错误已在最近的提交中修复,并将包含在TensorFlow的下一个版本中。目前,要避免此问题,请build TensorFlow from source或修改您的程序,如下所示:
#dx = tf.nn.dropout(x, keep_prob)
dx = tf.nn.dropout(tf.identity(x), keep_prob)