我想在張量流中實現多級鉸鏈損失。該配方如下:如何在張量流中實現多級鉸鏈損失
我很難獲得第二個最高預測概率在預測是正確的。我試圖用tf.nn.top_k來計算它,但不幸的是tf.nn.top_k沒有實現梯度操作。那我該如何實現呢?
我想在張量流中實現多級鉸鏈損失。該配方如下:如何在張量流中實現多級鉸鏈損失
我很難獲得第二個最高預測概率在預測是正確的。我試圖用tf.nn.top_k來計算它,但不幸的是tf.nn.top_k沒有實現梯度操作。那我該如何實現呢?
top_k
有梯度,在版本中添加0.8 here
謝謝。我從TF 0.7改爲0.8。 –
ps:正如另一位用戶所指出的那樣,在TensorFlow中有一個關於鉸鏈損失的工作示例,對於未來的文檔目的將是有用的,謝謝! –
我實現如下,但我認爲必須有更有效的實現。
logits:未縮放的分數,張量,形狀=(的batch_size,n_classes)
標籤:張量,形狀=(的batch_size)
的batch_size,n_classes:整數
def multi_class_hinge_loss(logits, label, batch_size, n_classes):
# get the correct logit
flat_logits = tf.reshape(logits, (-1,))
correct_id = tf.range(0, batch_size) * n_classes + label
correct_logit = tf.gather(flat_logits, correct_id)
# get the wrong maximum logit
max_label = tf.argmax(logits, 1)
top2, _ = tf.nn.top_k(logits, k=2, sorted=True)
top2 = tf.split(1, 2, top2)
for i in xrange(2):
top2[i] = tf.reshape(top2[i], (batch_size,))
wrong_max_logit = tf.select(tf.equal(max_label, label), top2[1], top2[0])
# calculate multi-class hinge loss
return tf.reduce_mean(tf.maximum(0., 1. + wrong_max_logit - correct_logit))
添加另一實現三行代碼 得分:非標度分數,張量,shape =(n_classes,batch_size),dtype = float32 類:張量,形狀=(batch_size,batch_size),dtype = float32
對於上述損失實現與選擇最違反類,而不是考慮基於所有類
#H - hard negative for each sample
H = tf.reduce_max(scores * (1 - classes), 0)
L = tf.nn.relu((1 - scores + H) * classes)
final_loss = tf.reduce_mean(tf.reduce_max(L, 0))
另一種實現方式,其中我們總結了所有的消極類
# implements loss as sum_(j~=y) max(0, 1 - s(x, y) + s(x, j))
def multiclasshingeloss1(scores, classes):
true_classes = tf.argmax(classes, 0)
idx_flattened = tf.range(0, scores.get_shape()[1]) * scores.get_shape()[0]+\
tf.cast(true_classes, dtype=tf.int32)
true_scores = tf.gather(tf.reshape(tf.transpose(scores), [-1]),
idx_flattened)
L = tf.nn.relu((1 - true_scores + scores) * (1 - classes))
final_loss = tf.reduce_mean(L)
return final_loss
您可以最小化在這裏轉置的實現。
哪個版本的TF你有?在最新版本中'top_k'有梯度 –