Получение NaN для нестандартной метрики ошибок c во время обучения - нормализованный GINI - PullRequest
0 голосов
/ 19 июня 2020

Я определяю специальную метрику c для расчета нормализованного коэффициента GINI для одной из моих задач. После долгих поисков по inte rnet я нашел код для metri c и принял его в соответствии с tensorflow 2.X. Однако во время обучения я получаю NaN для метри c. Я протестировал его с простыми массивами numpy и проверил результат. Однако, когда я подключился к обучению keras, я получаю NaN. Вот мой код ниже

def gini(actual, pred):# actual and pred of shape [1,n]
    print(f"\nPredictions = {pred}")
    actual = tf.reshape(actual,[1,-1])
    print(f"\nshape of actual is {actual.shape}")
    actual = tf.cast(actual, tf.float32)
    pred = tf.reshape(pred,[1,-1])
    n = tf.shape(actual)[1]
    print(f"\nSample size is {n}")
    indices = tf.nn.top_k(pred, k=n)[1][0]
    actual_sorted = tf.gather(actual[0], indices)
    cost = tf.reduce_sum(actual_sorted)
#     print(f"\nCost = {cost}")
    loss_proportion = tf.cumsum(actual_sorted) / cost
    null_model = tf.cast(tf.range(1, n + 1), tf.float32)/ tf.cast(n, tf.float32)
    g = tf.subtract(tf.cast(loss_proportion,tf.float32), null_model)
    g = tf.reduce_sum(g) / tf.cast(n, tf.float32)
    g /= (1.0 - tf.reduce_mean(actual)) / 2.0
    return g

def NormalizedGINI(a, p):
    return gini(a, p) / gini(a, a)

Любая помощь в том, как отлаживать / искать промежуточные значения внутри пользовательских метрик, будет большой помощью. Все операторы печати в пользовательских метриках c показывают несущественные результаты.

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