テンソルフローでマルチクラスヒンジ損失を実装したいと思います。以下のように製剤は、次のとおりです。テンソルフローでマルチクラスヒンジ損失を実装する方法
私は予測が正しければ、それは難しい秒、最大予測確率を取得するために見つけます。私は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))
は別の追加int型テンソル、形状=(n_classes、batch_size)、dtype = float32 スコア:テンソル、形状=(batch_size、batch_size)、dtype = float32
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
すべての負のクラスすべてのクラス
#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))
別の実施を考慮した損失の上に実現するため
あなた実装。
TFのどのバージョンをお持ちですか?最新バージョン 'top_k'にはグラデーションがあります –