如何在tensorflow中实现多类hinge损失函数

5

我想在tensorflow中实现多类hinge loss。其公式如下:

multi-class hinge loss function

当预测正确时,我发现很难获取第二大的预测概率。我尝试使用tf.nn.top_k进行计算,但不幸的是,tf.nn.top_k没有实现梯度操作。那么我该如何实现呢?


你使用的是哪个版本的TF?在最新版本中,top_k有梯度。 - Yaroslav Bulatov
@csz-carrot,我知道你提出这个问题已经有一段时间了,但如果你能让它工作起来,那将会帮助很多人。如果你能在这里发布损失函数的tensorflow实现,那就太好了。谢谢。 - betelgeuse
3个回答

3

top_k有梯度,是从0.8版本开始添加的,详见这里


谢谢。我从TF 0.7更换到了0.8。 - csz-carrot
请提供一个TensorFlow中hinge loss的工作示例,以备将来文档使用,谢谢! - Yaroslav Bulatov

2

只需三行代码即可添加另一个实现

scores: 未缩放的分数,张量,形状为(n_classes, batch_size),数据类型为float32

classes: 张量,形状为(batch_size, batch_size),数据类型为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

您可以根据您的实现方式来最小化这些转置。

1
我的实现如下,但我认为可能有更高效的实现。 logits: 未缩放的分数,张量,形状为(batch_size, n_classes) label: 张量,形状为(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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接