Потери становятся нан в модели Смеси на гибридном распределении Парето - PullRequest
1 голос
/ 21 февраля 2020

моя цель - вычислить функцию потерь в этой статье

для этой потери, нам нужно вычислить функции, которые зависят от наших оценок

def z_func(xi):
    return tf.divide((1+xi)** 2,2 * np.pi)

def gamma_cal(xi):
    val=tf.math.divide(lambertw(z_func(xi)),2)
    val=1+0.5*(1+tf.math.erf(tf.math.sqrt(val)))
    return val

def beta_cal(xi,sigma):
    z=z_func(xi)
    n= tf.multiply(sigma, tf.math.add(xi,1))
    d=tf.math.sqrt(lambertw(z))
    return tf.math.divide(n,d)


def alpha_cal(xi,mu,sigma):
    a=tf.math.sqrt(lambertw(z_func(xi)))
    a = tf.multiply(sigma, a)
    a=tf.math.add(a,mu)
    return a

и эта часть нормальна и функции распределения по Парето

def pdf_normal(y,mu,sigma,gamma):
    value = -tf.subtract(y, mu)**2
    value = tf.math.divide(value, 2*sigma**2)
    n=tf.math.exp(value)
    d=tf.math.multiply(gamma,tf.math.sqrt(2 * np.pi)*sigma)
    value = tf.math.divide(n, d)
    return tf.where(tf.is_nan(value), tf.zeros_like(value), value) 

def pareto_xi_pos(y,xi,alpha,beta,gamma):
    value = tf.subtract(y, alpha)
    value = tf.math.multiply(xi,value)
    value = tf.math.divide(value,beta)
    value=tf.math.add(value,1)

    expo=tf.math.divide(-1-xi,xi)


    n=tf.math.pow(value,expo)
    d = tf.math.multiply(gamma,beta)
    value= tf.math.divide(n,d)
    return tf.where(tf.math.less_equal(y,alpha), tf.zeros_like(value), value) 

, и это моя функция потерь, которую я пытаюсь минимизировать


def calc_pdf(y,mu,sigma,xi,gamma,alpha,beta):

    mask = tf.math.less_equal(y,alpha) 
    mask = tf.cast(mask, tf.keras.backend.floatx())


    mask2 =  tf.math.greater(y,alpha)
    mask2 = tf.cast(mask2, tf.keras.backend.floatx())

    normal_mask= tf.multiply(mask,pdf_normal(y,mu,sigma,gamma))
    pareto_mask= tf.multiply(mask2,pareto_xi_pos(y,xi,alpha,beta,gamma))



    return normal_mask+pareto_mask


def mdn_loss(y_true,y_pred):

       mu, sigma,xi, pi = tf.split(y_pred, num_or_size_splits=[m, m,m,m],axis=-1, name='mdn_coef_split') 


    gamma=gamma_cal(xi)
    beta=beta_cal(xi,sigma)
    alpha=alpha_cal(xi,mu,sigma)

    out = calc_pdf(y_true,mu,sigma,xi,gamma,alpha,beta)

    out = tf.multiply(out, pi)
    out = tf.reduce_sum(out, 1)
    out = -tf.math.log(out + 1e-10)
    return tf.reduce_mean(out)

Проблема заключается в том, что во время тренировки моя потеря становится Нан, и я не понимаю, почему

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