我正在定义以下损失函数:
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。
任何人都可以让我知道发生了什么事吗?谢谢。
答案 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)