Niedawno natknąłem się na tf.nn.sparse_softmax_cross_entropy_with_logits i nie mogę zrozumieć, jaka jest różnica w porównaniu do tf.nn.softmax_cross_entropy_with_logits .
Czy jedyną różnicą jest to, że wektory szkoleniowe y
muszą być zakodowane na gorąco podczas używania sparse_softmax_cross_entropy_with_logits
?
Czytając API, nie mogłem znaleźć żadnej innej różnicy w porównaniu z softmax_cross_entropy_with_logits
. Ale dlaczego potrzebujemy wtedy dodatkowej funkcji?
Czy nie powinien softmax_cross_entropy_with_logits
dawać takich samych wyników, jak sparse_softmax_cross_entropy_with_logits
gdyby był dostarczany z zakodowanymi na gorąco danymi / wektorami uczącymi?
neural-network
tensorflow
softmax
cross-entropy
daniel451
źródło
źródło
Odpowiedzi:
Posiadanie dwóch różnych funkcji jest wygodą , ponieważ dają ten sam wynik.
Różnica jest prosta:
sparse_softmax_cross_entropy_with_logits
etykiety muszą mieć kształt [rozmiar_batchu] i typ dtype int32 lub int64. Każda etykieta jest int w zakresie[0, num_classes-1]
.softmax_cross_entropy_with_logits
etykiety muszą mieć kształt [batch_size, num_classes] i dtype float32 lub float64.Etykiety używane w programie
softmax_cross_entropy_with_logits
to jedyna gorąca wersja etykiet używanych w programiesparse_softmax_cross_entropy_with_logits
.Inną niewielką różnicą jest to
sparse_softmax_cross_entropy_with_logits
, że możesz podać -1 jako etykietę, aby uzyskać stratę0
na tej etykiecie.źródło
Chciałbym tylko dodać 2 rzeczy do zaakceptowanej odpowiedzi, które można również znaleźć w dokumentacji TF.
Pierwszy:
Druga:
źródło
Obie funkcje obliczają te same wyniki, a sparse_softmax_cross_entropy_with_logits oblicza entropię krzyżową bezpośrednio na rzadkich etykietach zamiast konwertować je za pomocą kodowania na gorąco .
Możesz to sprawdzić, uruchamiając następujący program:
Tutaj tworzę losowy
logits
wektor długościdims
i generuję zakodowane na gorąco etykiety (gdzie element wpos
to 1, a inne to 0).Następnie obliczam softmax i sparse softmax i porównuję ich wyniki. Spróbuj uruchomić go ponownie kilka razy, aby upewnić się, że zawsze daje ten sam wynik
źródło