2016-08-23 2 views
2

В Caffe есть опция с функцией SoftmaxWithLoss, чтобы игнорировать все отрицательные метки (-1) при вычислении вероятностей, так что только 0 или вероятность положительной метки складываются до 1 .tensorflow - softmax игнорировать отрицательные метки (как и caffe)

Есть ли аналогичная функция с потерей softmax Tensorflow?

ответ

3

Только что приступил к работе --- Я создал горячий тензор по индексам меток, используя tf.one_hot (с глубиной, установленной на # меток). tf.one_hot автоматически нулевает все индексы с -1 в результате тензора one_hot (форма [партия, количество меток])

Это позволяет потерять softmax (т. е. tf.nn.softmax_cross_entropy_with_logits), чтобы «игнорировать» все -1 этикетки.

+0

Я не думаю, что это решение полезно. Первоначально я думал, что это сработало, поскольку оно показало, что потери от немеченого образца равны нулю. Но я заметил, что решение фактически сделало тренировку неустойчивой (потеря выстрела через крышу на вторую эпоху). Когда я вручную удалял немеченые образцы из учебной партии, все снова стабилизировалось. – mikkola

2

Я не совсем уверен, что ваше обходное решение действительно работает.

Caffe-х ignore_label в CAFFE семантический следует рассматривать как «этикетку образца, который должен быть проигнорированы», таким образом, он как эффект, что градиент для этого sampl_e не backpropagated, который ни в коей мере гарантировала самым использование одного горячего вектора.

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

С другой стороны, вы должны знать, что с точки зрения математики caffe's ignore_label и то, что вы делаете, совершенно разные.

Сказал это, я новичок в TF и ​​нуждаюсь в той же функции, что и у caffe's ignore_label.

+1

Я нашел еще один «обход», и это может сработать, поскольку оно не искусственно обнуляет -1 индексов, а собирает только те, которые не индексируются -1: cls_score_x = tf.reshape (tf.gather (cls_soft, tf . where (tf.not_equal (labels_ind, -1))), [- 1, 2]) label_x = tf.reshape (tf.gather (labels_ind, tf.where (tf.not_equal (labels_ind, -1))) , [- 1]) loss_cls = tf.reduce_mean (tf.nn.sparse_softmax_cross_entropy_with_logits (cls_score_x, label_x)), где cls_score_x и label_x - это фильтрованные запросы softmax (cls_score) и метки (labels_ind) без -1 –

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