Я пытаюсь создать пользовательскую потерю в 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 )
Есть два ограничения, которые не являются явными выше
- Я должен обработать размер пакета, который был проблематичным
- Модель Seq-to-Seq, поэтому X имеет 3 оси
(batch_size,sequence_length,nb_labels)
Так вот, что я реализовал.У меня есть функция, которая вычисляет матрицу М один раз, а затем я возвращаю свой пользовательский убыток с этим M, закодированным в.Я обучаю свой тэгер последовательности, используя эту потерю, но когда я использую его для прогнозирования, я получаю NAN как выходные вероятности.Я не знаю, что может быть причиной этой проблемы, я думаю, что это может быть ошибка при обработке длины последовательности или во время нормализации вероятностей вывода, но я понятия не имею, и мне трудно отладить это.
Любая помощь приветствуется, Большое спасибо за ваше внимание, Габриэль