【问题标题】:Tensorflow TypeError: Input 'pred' of 'Switch' Op has type float32 that does not match expected type of boolTensorflow TypeError:'Switch' Op 的输入'pred' 的 float32 类型与预期的 bool 类型不匹配
【发布时间】:2017-10-26 22:08:39
【问题描述】:

我目前正在使用 Tensorflow 构建深度神经网络,但在实施称为 dropout 的正则化技术时遇到了一些问题(查看 Geoffrey Hinton here 的原始论文)。

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

我查看了Tensorflow documentation regarding dropouttf.layers.dropout()方法的training参数定义为

Python 布尔值或 TensorFlow 布尔标量张量(例如 占位符)。是否在训练模式下返回输出(应用 dropout)或推理模式(返回未触及的输入)。

但是,在上面的代码中,我显然传入了tf.float32。我怀疑这是我的错误的原因 - 它甚至在错误消息本身中说明。那么这只是作者的一个错字,还是我不明白幕后发生了什么?

我应该只用这一行替换隐藏层声明吗?

hidden1_drop = tf.layers.dropout(hidden1, dropout_rate, training = True)

我还查看了其他 SO posts with similar errors,例如这个,但答案似乎表明错误源于过时的 Tensorflow 版本,事实并非如此——我最近才在我的机器上安装了一个几周前。

【问题讨论】:

    标签: python tensorflow data-science


    【解决方案1】:

    我会继续回答我自己的问题,因为我是个白痴。

    作者没有打错字。我按照他的教程写了一个错字。 training 可以是 Python 布尔值或 Tensorflow 布尔值张量。在书中,作者的实际代码是

    training = tf.placeholder_with_default(False, shape=())
    

    进行此切换应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2020-10-04
      • 2021-05-04
      • 2019-08-14
      • 1970-01-01
      • 2019-01-19
      相关资源
      最近更新 更多