Категориальная кросс-энтропия работает неправильно с функциями с горячим кодированием

Aug 18 2020

Я борюсь с проблемой category_crossentropy с одним горячим кодированием данных. Проблема заключается в неизменном выводе кода, представленного ниже:

            inputs = keras.Input(shape=(1190,), sparse=True)
            lay_1 = layers.Dense(1190, activation='relu')
            x = lay_1(inputs)
            x = layers.Dense(10, activation='relu')(x)
            out = layers.Dense(1, activation='sigmoid')(x)
            self.model = keras.Model(inputs, out, name='SimpleD2Dense')
            self.model.compile(
                optimizer=keras.optimizers.Adam(),
                loss=tf.losses.categorical_crossentropy,
                metrics=['accuracy']
            )
Epoch 1/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 2/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 3/3
1572/1572 - 7s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543

Несколько слов о данных: 1190 функций ( 10 актуальных функций по 119 категориям). Входными данными являются строки фрейма данных с 1190 значениями на выборку. Выход - двоичное значение 0 или 1.

Попытки, выполненные ранее: используется binary_crossentropy с удовлетворительными результатами, однако количества образцов недостаточно для получения хороших результатов по данным проверки. Пробовал использовать разные активации и размеры слоев.

Главный вопрос в том, почему категориальная_кросцентропия не работает и как ее правильно использовать.

Кроме того, возникает одно беспокойство по поводу представления данных, правильно ли это использовать в одной редкой строке данных, непосредственно закодированных в горячем режиме?

Ответы

10xAI Aug 18 2020 at 13:52

Чтобы он работал -

  1. Измените количество выходных нейронов на 02
  2. Активация вывода в Softmax
  3. Сохраните все векторы вывода OHE


Так устроен Керас изнутри. То же было написано на официальной странице документации

Класс BinaryCrossentropy
Используйте эту потерю кросс-энтропии, когда существует только два класса меток (предполагается, что это 0 и 1). Для каждого примера должно быть одно значение с плавающей запятой для каждого прогноза. В приведенном ниже фрагменте каждый из четырех примеров имеет только одно значение с плавающей точкой, а y_pred и y_true имеют форму [batch_size]

Класс
CategoryCrossentropy Форма y_pred и y_true: [batch_size, num_classes]

И мы знаем, что для сохранения мультикласса Classification вам нужно сделать весь вывод num_class относительно друг друга, поэтому мы используем softmax

Ref
Официальная страница Keras
Подобная ветка SE Аналогичная ветка
SE