TensorFlow:TypeError:不允许使用 `tf.Tensor` 作为 Python `bool`

Posted

技术标签:

【中文标题】TensorFlow:TypeError:不允许使用 `tf.Tensor` 作为 Python `bool`【英文标题】:TensorFlow: TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed 【发布时间】:2018-08-17 01:06:10 【问题描述】:

我正在尝试使用来自 CNN 输出的描述符来定义三元组损失,但是当我尝试训练网络时出现了这个错误。

我对损失函数的定义:

def compute_loss(descriptor, margin):
    diff_pos = descriptor[0:1800:3] - descriptor[1:1800:3]
    diff_neg = descriptor[0:1800:3] - descriptor[2:1800:3]
    Ltriplet = np.maximum(0, 1 - tf.square(diff_neg)/(tf.square(diff_pos) + margin))
    Lpair = tf.square(diff_pos)

    Loss = Ltriplet + Lpair

    return Loss

这里descriptor是CNN的结果,CNN的收益是一组三元组,依次包含anchor、puller和pusher。作为输入,我将 600 个三元组打包在一起并将它们输入 CNN。

然后我在训练网络的时候出现这个错误:

2018-03-08 16:40:49.529263: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
Traceback (most recent call last):
  File "/Users/gaoyingqiang/Documents/GitHub/Master-TUM/TDCV/exercise_3/ex3/task2_new.py", line 78, in <module>
    loss = compute_loss(h_fc2, margin)
  File "/Users/gaoyingqiang/Documents/GitHub/Master-TUM/TDCV/exercise_3/ex3/task2_new.py", line 37, in compute_loss
    Ltriplet = np.maximum(0, 1 - tf.square(diff_neg)/(tf.square(diff_pos) + margin))
  File "/Users/gaoyingqiang/.virtualenvs/ex3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 614, in __bool__
    raise TypeError("Using a `tf.Tensor` as a Python `bool` is not allowed. "
TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.

Process finished with exit code 1

哪里出错了?

【问题讨论】:

【参考方案1】:

您正在混合使用 numpy 和 tensorflow 操作。 Tensorflow 通常接受 numpy 数组(它们的值是静态已知的,因此可以转换为常量),但反之亦然(张量值仅在会话运行时才知道,eager evaluation 除外)。

解决方法:将np.maximum改为tf.maximum

【讨论】:

以上是关于TensorFlow:TypeError:不允许使用 `tf.Tensor` 作为 Python `bool`的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法将值 dtype('<M8[ns]') 转换为 TensorFlow DType

构建神经网络 [TensorFlow 2.0] 模型子类化 - ValueError/TypeError

导入 TensorFlow 时出错。 TypeError:预期字节,找到描述符

Tensorflow 2.5.0 - TypeError:函数构建代码之外的操作正在传递“图形”张量

获取 TypeError:尝试使用 idxmax() 时,此 dtype 不允许缩减操作 'argmax'

Python 3 处理错误 TypeError:不允许捕获不继承自 BaseException 的类