моя цель - вычислить функцию потерь в этой статье
для этой потери, нам нужно вычислить функции, которые зависят от наших оценок
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)
Проблема заключается в том, что во время тренировки моя потеря становится Нан, и я не понимаю, почему