Перекрестная энтропийная потеря Keras / Tensorflow cumstom с динамическим маскированием - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь создать пользовательскую потерю в Keras, используя Tensorflow Backend.

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

Дляинформация, модель представляет собой рекуррентную нейронную сеть, модель Sequence-to-Sequence, но потеря должна работать, даже если это был простой классификатор.


Эта маска должна быть динамической.

Я имею в виду, что для каждого образца данных применяется различная маска в зависимости от значения y_true.


Теперь я объясню, почему я хочу это сделать, чтобы можно было детализировать процесс маскирования

У меня есть некоторая иерархия меток в моей проблеме.Допустим, мои ярлыки:

labels = [ 'A1','A2','B1','B2','C1','C2','C3' ]

Итак, у меня есть несколько больших категорий 'A', 'B', 'C', и для каждого у меня есть два (или более) ярлыка.

Теперь, что я хочу сделатьсостоит в том, чтобы вычислить перекрестную потерю энтропии, учитывая путаницу только в метках в большой категории.Поэтому, если в тренировочном образце есть y_true=A1, я применю маску mask_vector=[1,1,0,0,0,0,0], чтобы сохранить вероятности для A1 и A2.После этого я должен заново нормализовать, чтобы P(A1) + P(A2) = 1, а затем вычислить кросс-энтропийную потерю.

Итак, у меня есть матрица путаницы, которая выглядит следующим образом:

    --  A1   A2   B1   B2   C1  C2  C3
    A1   1    1    0    0    0   0   0
    A2   1    1    0    0    0   0   0
    B1   0    0    1    1    0   0   0
M = B2   0    0    1    1    0   0   0
    C1   0    0    0    0    1   1   1
    C2   0    0    0    0    1   1   1
    C3   0    0    0    0    1   1   1

, поэтому, если я напишууравнения y_true = [1,0,0,0,0,0,0] затем

                     //index the correct column from M     //mask proba
cross_entropy(y_true, matmul( y_true,M )                   * y_pred     )

Есть два ограничения, которые не являются явными выше

  1. Я должен обработать размер пакета, который был проблематичным
  2. Модель Seq-to-Seq, поэтому X имеет 3 оси (batch_size,sequence_length,nb_labels)

Так вот, что я реализовал.У меня есть функция, которая вычисляет матрицу М один раз, а затем я возвращаю свой пользовательский убыток с этим M, закодированным в.Я обучаю свой тэгер последовательности, используя эту потерю, но когда я использую его для прогнозирования, я получаю NAN как выходные вероятности.Я не знаю, что может быть причиной этой проблемы, я думаю, что это может быть ошибка при обработке длины последовательности или во время нормализации вероятностей вывода, но я понятия не имею, и мне трудно отладить это.

Любая помощь приветствуется, Большое спасибо за ваше внимание, Габриэль

...