Sparse_categorical_crossentropy vs categorical_crossentropy (keras, dokładność)


21

Które są lepsze dla dokładności, czy są takie same? Oczywiście, jeśli używasz categorical_crossentropy, używasz jednego gorącego kodowania, a jeśli używasz sparse_categorical_crossentropy, kodujesz jako normalne liczby całkowite. Dodatkowo, kiedy jedno jest lepsze od drugiego?

Odpowiedzi:


27

Użyj rzadkiej kategorycznej crossentropy, gdy twoje klasy wzajemnie się wykluczają (np. Gdy każda próbka należy dokładnie do jednej klasy), a kategorycznej crosssentropii, gdy jedna próbka może mieć wiele klas lub etykiet, istnieje małe prawdopodobieństwo (np. [0,5, 0,3, 0,2]).

Wzór na kategoryczną crossentropy (S - próbki, C - klasy, s∈do - próbka należy do klasy c) to:

-1N.∑s∈S.∑do∈do1s∈dolosolp(s∈do)

W przypadku, gdy klasy są wyłączne, nie trzeba ich sumować - dla każdej próbki jest tylko niezerowa wartość -losolp(s∈do) dla prawdziwej klasy c.

Pozwala to zaoszczędzić czas i pamięć. Rozważ przypadek 10000 klas, które wzajemnie się wykluczają - tylko 1 log zamiast sumowania 10000 dla każdej próbki, tylko jedna liczba całkowita zamiast 10000 liczb zmiennoprzecinkowych.

Formuła jest taka sama w obu przypadkach, więc nie powinno to mieć wpływu na dokładność.


1
Czy wpływają one w różny sposób na dokładność, na przykład w zestawie danych cyfr mnistycznych?
— Mistrz M

1
Matematycznie nie ma różnicy. Jeśli istnieje znacząca różnica w wartościach obliczanych przez implementacje (powiedzmy tensorflow lub pytorch), brzmi to jak błąd. Proste porównanie danych losowych (1000 klas, 10 000 próbek) nie wykazuje różnicy.
— frenzykryger

Drogi frenzykrygerze, myślę, że zapomniałeś minus tylko dla jednego przykładu próbki: „dla każdej próbki tylko niezerowa wartość to po prostu -log (p (s c))”. Dla reszty miła odpowiedź. ∈
— Nicg

Masz rację. Dzięki!
— frenzykryger

@frenzykryger Pracuję nad problemem wielu wyjść. Mam 3 oddzielne dane wyjściowe o1,o2,o3i każdy ma 167,11,7odpowiednio klasy. Przeczytałem twoją odpowiedź, że nie będzie to miało znaczenia, ale czy jest jakakolwiek różnica, jeśli jej użyję, sparse__czy nie. Czy mogę przejść na categoricalostatnie 2 i sparsepierwsze, ponieważ w pierwszej klasie jest 167 klas?
— Deshwal

6

Odpowiedź w pigułce

Jeśli twoje cele są zakodowane na gorąco, użyj categorical_crossentropy. Przykłady kodowania jednorazowego:

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

Ale jeśli twoim celem są liczby całkowite, użyj sparse_categorical_crossentropy. Przykłady kodowania liczb całkowitych (dla uzupełnienia):

1
2
3

1
Czy potrzebuję pojedynczego węzła wyjściowego sparse_categorical_crossentropy? A co oznacza ten from_logitsargument?
— Leevo,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.