1 回答

TA貢獻1864條經驗 獲得超6個贊
似乎從數字不穩(wěn)定性tf.norm患有作為解釋這里
他們還建議使用更穩(wěn)定的 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
優(yōu)化該功能的空間很大,這里是對我的其他SO 問題的參考- 正在解決這個問題。
添加回答
舉報