今天在写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