есть ли Keras, эквивалентный np.nanmean ()? - PullRequest
0 голосов
/ 24 марта 2019

В функции потерь Keras я хотел бы иметь эквивалент np.nanmean():

В функции потерь en эквивалент следующего упрощенного примера потерпел неудачу по очевидным причинам.Не удалось найти способ справиться с этим, например, используя K.gather().

Упрощенный пример:

from keras import backend as K
import numpy as np


nominator = np.array([-6,4,-8,7,0,5,1,-2])
denominator = np.array([1,4,5,7,9,0,12,0])

Nom = K.variable(nominator,dtype='int32')
DeNom = K.variable(denominator,dtype='int32')

Ratio = Nom/DeNom
Loss = K.sum(Ratio)

Из-за 0 в знаменателе это вернет значение Nan вФункция потери:

K.eval(Loss)
nan

Я хотел бы иметь какой-либо способ произвести эквивалент

Loss = K.nansum(Ratio)

Или эквивалент индексов:


Filter_Ratio = K.gather(Ratio,K.any(DeNom))
Loss = K.sum(Filter_Ratio)


ЗдесьFilter_Ratio = [-6,4,-8,7,0,1]/[1,4,5,7,9,12]

Но нет K.nansum() и K.gather() не работает таким образом.

Ошеломленная реализация, которую я хотел перенести в Keras:

nominator = np.array([-6,4,-8,7,0,5,1,2])
denominator = np.array([1,4,5,7,9,0,12,0])
ind = denominator!=0
ratio = nominator[ind]/denominator[ind]

loss = np.sum(ratio)

1 Ответ

0 голосов
/ 24 марта 2019
from keras import backend as K
import tensorflow as tf


Nom = tf.constant([-6,4,-8,7,0,5,1,-2], dtype='int32')
DeNom = tf.constant([1,4,5,7,9,0,12,0], dtype='int32')
Ratio = Nom/DeNom
Ratio1 = tf.where(tf.is_inf(Ratio), tf.zeros_like(Ratio), Ratio)
Loss = K.sum(Ratio1)

with tf.Session() as sess:
    print (sess.run(Loss))

Выход:

-5.516666666666667

  • Разделите тензоры и замените значения бесконечности в тензоре Ratio нулями

    Ratio1 = tf.where(tf.is_inf(Ratio), tf.zeros_like(Ratio), Ratio)

tf.where очень похож на np.where

https://www.tensorflow.org/api_docs/python/tf/where

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