1

我的目标是计算本文中的损失函数

对于这种损失,我们需要计算依赖于我们的估计器的函数

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)

问题是在训练期间我的损失变成了一个南,我不明白为什么

4

0 回答 0