“ TypeError:将tf.Tensor作为Python布尔不允许使用”从哪里来?

时间:2019-05-14 17:58:33

标签: python tensorflow keras loss-function

我正在定义以下损失函数:

if (not (user_input == "whole number" or user_input == "decimal number")) 
{
    std::cout << "\nInvalid";
    goto label1;
}

这有效,但是,当我将第4行更改为smooth = 1.0 def loss(y_true, y_pred): y_true_f = K.flatten(y_true) y_pred_f = K.flatten(y_pred) if K.sum(y_true_f) == 0 and K.sum(y_pred_f) == 0: return 1 else: intersection = K.sum(y_true_f * y_pred_f) return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth) 时,出现问题标题中提到的TypeError。

任何人都可以让我知道发生了什么事吗?谢谢。

1 个答案:

答案 0 :(得分:0)

对,tensorflow通过首先编译将要完成的所有操作的图形来工作。这类似于Java和C ++必须先编译代码,然后分别运行代码的方式。因此,在tensorflow代码中无法使用python if语句,因为在编译时实际上没有任何数字,因此它不知道遵循哪条路线。

为了解决这个问题,您需要编写没有任何python if语句的代码。这通常说起来容易做起来难,但是幸运的是,在您的情况下,使用tf.where调用看起来很简单。我的代码示例处于tensorflow中,因为这就是我所知道的,但希望可以轻松将其扩展到keras。

total = tf.abs(tf.reduce_sum(y_true_f)) + tf.abs(tf.reduce_sum(y_pred_f))
divisor = tf.where(tf.equal(total, 0), 1, total)
# Now we can divide cleanly
return (2. * intersection + smooth) / (divisor + smooth)