TensorFlow: матричная функция потерь - PullRequest
0 голосов
/ 10 июня 2018

В настоящее время у меня есть RNN, в котором мои метки имеют два класса.Вывод [1, 0] или [0, 1].Я хотел бы реализовать матрицу потерь, чтобы неправильное угадывание [1, 0] для [0, 1] было в 100 раз дороже, чем угадывание [0, 1] для [1, 0].Поэтому я думаю, что моя матрица потерь будет [[0, 1], [100, 0]].

Возможно ли это с тензорным потоком?Если да, то какую функцию стоимости я должен использовать?Спасибо

1 Ответ

0 голосов
/ 12 июня 2018

Один из вариантов - использовать справочную таблицу для различных комбинаций.Это позволит вам затем определить вес любой используемой потери (например, кросс-энтропии) на основе дискретизированного прогноза (поскольку эта операция поиска не дифференцируема).

import tensorflow as tf

# This example is using eager execution, but the same code will work with graph
# building if you run it in a Session.
tf.enable_eager_execution()

penalties = tf.constant([
    # Predicted 0
    0.,    # Label 0
    100.,  # Label 1
    # Predicted 1
    1.,    # Label 0
    0.     # Label 1
])

def compute_loss_weight(predicted, label):
  sparse_predicted = tf.argmax(predicted, axis=-1)
  sparse_label = tf.argmax(label, axis=-1)
  offset = sparse_predicted * tf.shape(label, out_type=tf.int64)[-1] + sparse_label
  return tf.gather(params=penalties, indices=offset)

print(compute_loss_weight(predicted=[1, 0], label=[0, 1]))  # 100.
print(compute_loss_weight(predicted=[0, 1], label=[1, 0]))  # 1.
# Also works on batches
print(compute_loss_weight(predicted=[[1, 0], [1, 0], [0, 1], [0, 1]],
                          label=    [[0, 1], [1, 0], [0, 1], [1, 0]]))
# Prints                             [100.   0.       0.      1.]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...