Возможный подход может использовать:
tf.where(
condition,
x=None,
y=None,
name=None
)
и перечисленные связанные функции: https://www.tensorflow.org/api_docs/python/tf, которые похожи на бесшумные версии, которые вы изучаете.
Например, вы можете рассмотреть что-то вроде использования вышеупомянутой функции tf.where () для проверки на нулевые записи и либо выбора из исходного тензора (x), либо тензора с аналогичной формой «единиц» в зависимости отрезультат. Затем вы можете вычислить log результирующего тензора и выполнить окончательное суммирование по этому результату и т. Д.
Ниже приведен пример использования Colab с выполнением Eager, который демонстрирует идею немного большеявно.
%tensorflow_version 2.x
# Above only works in Google Colab.
# Also, note eager execution is default True for Tensorflow 2.0
import tensorflow as tf
y_true = tf.Variable([[2.0],[0.0],[0.0],[3.0],[4.0]])
y_pred = tf.Variable([[2.0],[-1.0],[1.0],[3.0],[4.0]])
def my_loss_function(y_true, y_pred):
print('y_true:')
print(y_true)
print('y_pred:')
print(y_pred)
y_zeros = tf.zeros_like(y_pred)
print('y_zeros:')
print(y_zeros)
y_mask = tf.math.greater(y_pred, y_zeros)
print('y_mask:')
print(y_mask)
res = tf.boolean_mask(y_pred, y_mask)
print('res:')
print(res)
logres = tf.math.log(res)
print('logres:')
print(logres)
finres = tf.math.reduce_sum(logres)
print('finres:')
print(finres)
return finres
myres = my_loss_function(y_true, y_pred)
print(myres)
Надеюсь, это поможет.