Как я могу реализовать взвешенные кросс-энтропийные потери в тензорном потоке, используя 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], то веса потерь применяются к каждому соответствующему образцу.