Откуда берется сообщение 'TypeError: Использование `tf.Tensor` в качестве Python' bool` is not '? - PullRequest
0 голосов
/ 14 мая 2019

Я определяю следующую функцию потерь:

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)

Это работает, но когда я изменяю строку 4 на if K.sum(y_true) > 0 and K.sum(y_pred) > 0:, я получаю TypeError, как упомянуто в заголовке вопроса.

Кто-нибудь может дать мне знать, что происходит?Спасибо.

1 Ответ

0 голосов
/ 14 мая 2019

Правильно, tenorflow работает, сначала компилируя график всех операций, которые будут выполнены. Это похоже на то, как Java и C ++ должны сначала скомпилировать код, а затем запустить его отдельно. Из-за этого в коде tenorflow не может быть оператора if для python, так как на самом деле во время его компиляции нет никаких чисел, поэтому он не будет знать, какой из маршрутов следовать.

Чтобы учесть это, вам нужно написать код без каких-либо операторов python if. Это часто легче сказать, чем сделать, но, к счастью, в вашем случае это выглядит довольно просто при использовании вызова tf.where. Мой пример кода находится в тензорном потоке, поскольку это то, что я знаю, но, надеюсь, будет легко распространить его на керасы.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...