TensorFlow v1.10 Перекрестная энтропия с Logits v2 на класс?
Заметки:
Этот вопрос относится к API Python3.6 + версии TensorFlow v1.10 (стабильной).
Соответствующий исходный код можно найти в строках 1781-1897 на связанной странице.
Предположим, что у вас есть пакет последовательностей фиксированной длины, и он хочет сегментировать последовательности по классам, где элементы в последовательностях имеют мягко маркированные вероятности классов.
# number of sequences per batch
BATCH_SIZE = 2
# length of sequences
LENGTH = 10
# number of feature channels in sequence
CHANNELS = 5
# number of classes
CLASSES = 3
I_SHAPE = (BATCH_SIZE, LENGTH, CHANNELS)
O_SHAPE = (BATCH_SIZE, LENGTH, CLASSES)
# dummy data of sequences
sequences = np.random.random(I_SHAPE).astype('float32')
# labels per class for our dummy data
class_probs = np.random.random(I_SHAPE).astype('float32')
inputs = tf.placeholder(tf.float32, shape=I_SHAPE, name='sequence_batch')
# simple net to convert sequences to logits
net = tf.layers.conv1d(inputs, CLASSES, 3, padding='same')
тогда мы можем рассчитать кросс-энтропию с логитами через
out = sess.run(net, feed_dict={inputs: sequences})
diff = sess.run(tf.nn.softmax_cross_entropy_with_logits_v2(labels=class_probs, logits=out)
Однако вместо того, чтобы получать кросс-энтропийную потерю для каждого класса, я получаю совокупность (т.е. (BATCH_SIZE, LENGTH)
скорее, чем (BATCH_SIZE, LENGTH, CLASSES)
)
Для простоты оставим каналы на последней оси (-1
).
Как бы я изменил исходный код, чтобы он возвращал кросс-энтропийные потери на класс?
Было бы что-то вроде
logits = tf.nn.softmax(out)
(class_probs - tf.log(logits + 1e-9)) +
((1-class_probs) * tf.log(1-logits + 1e-9))
сделай это?