Как я могу реализовать взвешенные кросс-энтропийные потери в тензорном потоке, используя sparse_softmax_cross_entropy_with_logits

Я начинаю использовать tenorflow (исходящий от Caffe) и использую потери sparse_softmax_cross_entropy_with_logits, Функция принимает метки как 0,1,...C-1 вместо однообразных кодировок. Теперь я хочу использовать взвешивание в зависимости от метки класса; Я знаю, что это может быть сделано, возможно, с умножением матрицы, если я использую softmax_cross_entropy_with_logits (одна горячая кодировка), есть ли способ сделать то же самое с sparse_softmax_cross_entropy_with_logits?

3 ответа

import  tensorflow as tf
import numpy as np

np.random.seed(123)
sess = tf.InteractiveSession()

# let's say we have the logits and labels of a batch of size 6 with 5 classes
logits = tf.constant(np.random.randint(0, 10, 30).reshape(6, 5), dtype=tf.float32)
labels = tf.constant(np.random.randint(0, 5, 6), dtype=tf.int32)

# specify some class weightings
class_weights = tf.constant([0.3, 0.1, 0.2, 0.3, 0.1])

# specify the weights for each sample in the batch (without having to compute the onehot label matrix)
weights = tf.gather(class_weights, labels)

# compute the loss
tf.losses.sparse_softmax_cross_entropy(labels, logits, weights).eval()

Специально для бинарной классификации, есть weighted_cross_entropy_with_logits, который вычисляет взвешенную кросс-энтропию softmax.

sparse_softmax_cross_entropy_with_logits хвост для высокоэффективной невзвешенной операции (см. SparseSoftmaxXentWithLogitsOp который использует SparseXentEigenImpl под капотом), поэтому он не "подключаемый".

В случае нескольких классов, вы можете либо переключиться на однократное кодирование, либо использовать tf.losses.sparse_softmax_cross_entropy Функция потери в хакерской манере, как уже предлагалось, где вам придется передавать веса в зависимости от меток в текущей партии.

Веса классов умножаются на логиты, так что все еще работает для sparse_softmax_cross_entropy_with_logits. Обратитесь к этому решению для "Функция потерь для двоичного классификатора с несбалансированным классом в потоке Тензор".

В качестве примечания, вы можете передавать веса непосредственно в sparse_softmax_cross_entropy

tf.contrib.losses.sparse_softmax_cross_entropy(logits, labels, weight=1.0, scope=None)

Этот метод для потери кросс-энтропии с использованием

tf.nn.sparse_softmax_cross_entropy_with_logits.

Вес действует как коэффициент потери. Если скаляр предоставлен, тогда потеря просто масштабируется данным значением. Если вес является тензором размера [batch_size], то веса потерь применяются к каждому соответствующему образцу.

Другие вопросы по тегам