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?
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 ∈ c - próbka należy do klasy c) to:
- 1N.∑s ∈ S∑c ∈ C.1s ∈ cl o gp ( s ∈ c )
W przypadku, gdy klasy są wyłączne, nie trzeba ich sumować - dla każdej próbki jest tylko niezerowa wartość - l o gp ( s ∈ c ) 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ść.
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):
o1,o2,o3
i każdy ma167,11,7
odpowiednio 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ść nacategorical
ostatnie 2 isparse
pierwsze, ponieważ w pierwszej klasie jest 167 klas?Odpowiedź w pigułce
Jeśli twoje cele są zakodowane na gorąco, użyj categorical_crossentropy. Przykłady kodowania jednorazowego:
Ale jeśli twoim celem są liczby całkowite, użyj sparse_categorical_crossentropy. Przykłady kodowania liczb całkowitych (dla uzupełnienia):
źródło
sparse_categorical_crossentropy
? A co oznacza tenfrom_logits
argument?