Sparse_categorical_crossentropy vs категорическая_кросентропия (керас, точность)

20

Что лучше для точности или они одинаковые? Конечно, если вы используете categoryorical_crossentropy, вы используете одну горячую кодировку, а если вы используете sparse_categorical_crossentropy, вы кодируете как обычные целые числа. Кроме того, когда один лучше другого?

Мастер М
источник

Ответы:

26

Используйте разреженную категориальную кроссцентропию, когда ваши классы являются взаимоисключающими (например, когда каждая выборка принадлежит точно одному классу), и категориальную кроссцентропию, когда одна выборка может иметь несколько классов, или метки имеют мягкие вероятности (например, [0,5, 0,3, 0,2]).

Формула для категориальной кроссентропии (S - выборки, C - классификация, - выборка относится к классу c):sс

-1NΣsSΣсС1sсLограммп(sс)

В случае, когда классы являются исключительными, вам не нужно суммировать их - для каждого образца только ненулевое значение просто для истинного класса c.-Lограммп(sс)

Это позволяет экономить время и память. Рассмотрим случай 10000 классов, когда они являются взаимоисключающими - только 1 log вместо суммирования 10000 для каждого образца, только одно целое число вместо 10000 float.

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

frenzykryger
источник
1
Они влияют на точность по-разному, например, на набор данных mnist digits?
Мастер М
1
Математически нет никакой разницы. Если существует значительная разница в значениях, вычисленных реализациями (скажем, tenorflow или pytorch), то это звучит как ошибка. Простое сравнение по случайным данным (1000 классов, 10 000 выборок) не показывает никакой разницы.
frenzykryger
Ты прав. Благодарность!
frenzykryger
@frenzykryger Я работаю над проблемой множественного вывода. У меня есть 3 отдельных выхода, o1,o2,o3и у каждого есть 167,11,7классы соответственно. Я прочитал ваш ответ, что это не будет иметь никакого значения, но есть ли разница, буду ли я использовать sparse__или нет. Могу ли я перейти к categoricalпоследним 2 и sparseк первому, поскольку в первом классе 167 классов?
Дешвал
5

Ответ, в двух словах

Если ваши цели имеют горячее кодирование, используйте categoryorical_crossentropy. Примеры однократного кодирования:

[1,0,0]
[0,1,0] 
[0,0,1]

Но если ваши цели - целые числа, используйте sparse_categorical_crossentropy. Примеры целочисленных кодировок (для завершения):

1
2
3
user78035
источник
Нужен ли один выходной узел для sparse_categorical_crossentropy? А что значит from_logitsаргумент?
Леево