1 回答
TA贡献1864条经验 获得超6个赞
似乎从数字不稳定性tf.norm患有作为解释这里
他们还建议使用更稳定的 l2 范数,所以我尝试了这一点,也得到了 nan 值,这要归功于 0 梯度。所以我将它们与梯度裁剪一起使用,到目前为止效果很好,损失函数正在工作并设法收敛。
def last_attempt(y_true, y_pred):
import tensorflow as tf
import numpy as np
loss = tf.zeros(1)
for i in range(y_pred.shape[0]):
dist = tf.gather(y_pred, [i], axis=0)
y = y_true.numpy().squeeze()
norm = tf.map_fn(tf.nn.l2_loss, dist-y_pred)
d = norm.numpy()
d[np.where(y != y[i])] = 0.0
max_pos = tf.gather(norm, np.argmax(d))
d = norm.numpy()
d[np.where(y == y[i])] = np.inf
min_neg = tf.gather(norm, np.argmin(d))
loss += tf.clip_by_value(max_pos - min_neg + tf.constant(1, dtype=tf.float32),
1e-8, 1e1)
return loss
优化该功能的空间很大,这里是对我的其他SO 问题的参考- 正在解决这个问题。
添加回答
举报