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

本文探讨了在使用TensorFlow进行RNN编程时遇到的关于Dropout的问题,特别是使用tf.contrib.layers.dropout与tf.nn.dropout的区别。通过更换dropout函数解决了TypeError错误,并分析了两种函数的不同之处。

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

评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值