Вычислить логарифм ненулевых значений в тензоре с керасом - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь реализовать пользовательскую функцию потерь, и она требует взять логарифм значений в выходном тензоре из модели. Тензор также может содержать нули, поэтому я хочу принимать только ненулевые значения и вычислять логарифм.

Выходной тензор имеет форму (20,224,224). Я мог бы получить число ненулевых элементов вдоль оси 0, используя следующую функцию.

#To get the number of nonzero elements along the axis 0                
count = K.tf.count_nonzero(y,axis=0) 

Но я не мог понять, как рассчитать ненулевой журнал. Я мог бы придумать решение, как показано ниже, но не уверен насчет его эквивалента.

loss = np.log2(y, out=np.zeros_like(y), where=(y!=0)) 

Может кто-нибудь помочь мне с вычислением логарифма ненулей вдоль оси 0 для тензора.

1 Ответ

0 голосов
/ 27 октября 2019

Возможный подход может использовать:

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)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...