2016-04-28 3 views
3

Я хочу реализовать многоклассовые потери петли в тензорном потоке. Состав выглядит следующим образом:Как реализовать многоуровневую потерю петли в тензорном потоке

multi-class hinge loss function

Я считаю, что трудно получить вторую вероятность максимального предсказания, когда предсказание является правильным. Я попытался использовать tf.nn.top_k для его вычисления, но, к сожалению, tf.nn.top_k не выполняет операцию градиента. Итак, как я могу это реализовать?

+0

какая версия TF у вас есть? В последней версии 'top_k' имеет градиенты –

ответ

3

top_k имеет градиенты, добавленные в версии 0.8 here

+0

Спасибо. Я изменился с TF 0,7 до 0,8. –

+0

ps: как еще один пользователь замечает, было бы полезно иметь рабочий пример потери петли в TensorFlow для будущих целей документа, спасибо! –

1

Моя реализация выглядит следующим образом, но я думаю, что должны быть более эффективные реализации.

логит-анализ: непересчитанных оценки, тензор, форма = (batch_size, n_classes)

этикетки: тензор, форма = (batch_size,)

batch_size, n_classes: Int

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)) 
1

Добавление другого реализация с тремя строками кода оценки: немасштабированные оценки, тензор, форма = (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 

Вы можете минимизировать переставляешь здесь на основе вашего реализация.

Смежные вопросы