我目前正在使用 Tensorflow 构建深度神经网络,并在实现称为 dropout 的正则化技术时遇到了一些问题(请在此处查看Geoffrey Hinton 的原始论文)。
Tensorflow 有一个功能可以解决这个问题,我正在学习Aurelien Geron 的书Hands-On Machine Learning with Scikit-Learn & Tensorflow 的教程(顺便说一下,这太不可思议了)。在其中,他实现 dropout 的示例代码包括声明一个training
占位符:
training = tf.placeholder(tf.float32, shape = (), name = "training")
然后创建隐藏层 dropout 对象:
hidden1_drop = tf.layers.dropout(hidden1, dropout_rate, training = training)
但是,当我执行此操作时,我收到指向上述行的错误。
TypeError: Input 'pred' of 'Switch' Op has type float32 that does not match expected type of bool
我查看了有关dropout 的 Tensorflow 文档,tf.layers.dropout()
方法的training
参数定义为
要么是 Python 布尔值,要么是 TensorFlow 布尔值标量张量(例如占位符)。是否以训练模式(应用 dropout)或推理模式返回输出(返回原封不动的输入)。
但是,在上面的代码中,我清楚地传入了tf.float32
. 我怀疑这是我的错误的原因 - 它甚至在错误消息本身中有所说明。那么这仅仅是作者的错别字,还是我不了解幕后发生的事情?
我应该用这一行替换隐藏层声明吗?
hidden1_drop = tf.layers.dropout(hidden1, dropout_rate, training = True)
我还查看了其他类似错误的SO帖子,例如这个,但答案似乎表明该错误源于过时的 Tensorflow 版本,事实并非如此 - 我最近才在我的机器上安装了几周前。
我会继续回答我自己的问题,因为我是个白痴。
作者没有打错字。我按照他的教程打了一个错字。training
可以是 Python 布尔值或 Tensorflow 布尔张量。在书中,作者的实际代码是
training = tf.placeholder_with_default(False, shape=())
进行此切换应该可以解决问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句