tf.contrib.layers.dropout和tf.nn.dropout的不同导致的bug

今天在写RNN的时候,Dense layer需要添加一个dropout,至于keep_prob按道理是需要用一个placeholder:

self.dropout_keep_prob = tf.placeholder(tf.float32, name='keep_prob')

来占位,以便于在训练/测试的时候区分。利用feed_dict 来传递 keep_prob的值
看别人的教程,一模一样的加了个这样的dropout:

fc = tf.contrib.layers.dropout(fc,keep_prob=self.dropout_keep_prob)

结果在训练的时候报错

TypeError: Using a ‘tf.Tensor’ as a Python ‘bool’ is not allowed…

然而这个报错并不能真正解释问题。还好根据定位,把keep_prob设为固定值就不会报错了,这就很奇怪了,keep_prob固定还要dropout何用?
去找了找原因发现:
tf.nn.dropout() 和 tf.tf.contrib.layers.dropout() 有一点区别
把:

fc = tf.contrib.layers.dropout(fc,keep_prob=self.dropout_keep_prob)

换成:

fc = tf.nn.dropout(fc,keep_prob=self.dropout_keep_prob)

就好了。

为什么呢?

简单来说就是tf.tf.contrib.layers.dropout() 是把tf.nn.dropout() 包装起来了,高级API,多了一个参数“ is_training”,默认是不能让keep_prob为Tensor的。


这样有好处也有坏处…我就遇上了坏处,并不想多传一个True/Flase来决定是否能让tensor作为keep_prob的值来传递~
参考链接:tensorflow: what’s the difference between tf.nn.dropout and tf.layers.dropout

猜你喜欢

转载自blog.csdn.net/UESTC_V/article/details/79121642