Logity po prostu oznaczają, że funkcja działa na nieskalowanym wyjściu wcześniejszych warstw i że względna skala dla zrozumienia jednostek jest liniowa. Oznacza to w szczególności, że suma danych wejściowych może nie być równa 1, że wartości nie są prawdopodobieństwami (możesz mieć wartość wejściową 5).
tf.nn.softmax
daje tylko wynik zastosowania funkcji softmax do tensora wejściowego. Softmax „wyciska” dane wejściowe, tak że sum(input) = 1
: jest to sposób na normalizację. Kształt wyjścia softmax jest taki sam jak wejście: po prostu normalizuje wartości. Wyniki softmax można interpretować jako prawdopodobieństwa.
a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508 0.205666 0.25120102 0.37474789]]
Natomiast tf.nn.softmax_cross_entropy_with_logits
oblicza entropię krzyżową wyniku po zastosowaniu funkcji softmax (ale robi to wszystko razem w bardziej matematycznie ostrożny sposób). Jest podobny do wyniku:
sm = tf.nn.softmax(x)
ce = cross_entropy(sm)
Entropia krzyżowa jest metryką podsumowującą: sumuje się między elementami. Wyjście tensora tf.nn.softmax_cross_entropy_with_logits
kształtu [2,5]
ma kształt [2,1]
(pierwszy wymiar jest traktowany jako partia).
Jeśli chcesz przeprowadzić optymalizację w celu zminimalizowania entropii krzyżowej ORAZ chcesz zmiękczyć po ostatniej warstwie, powinieneś użyć tf.nn.softmax_cross_entropy_with_logits
zamiast robić to sam, ponieważ obejmuje matematycznie niestabilne liczbowo przypadki narożników. W przeciwnym razie hakujesz go, dodając tu i ówdzie małe epsilony.
Edytowano 2016-02-07:
Jeśli masz etykiety jednoklasowe, w których obiekt może należeć tylko do jednej klasy, możesz teraz rozważyć użycie tf.nn.sparse_softmax_cross_entropy_with_logits
, aby nie trzeba było konwertować etykiet na gęstą tablicę jednogrzbietową. Ta funkcja została dodana po wersji 0.6.0.
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy)
. Ale kiedy używam innego sposobu,pred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
wynik jest stabilny i lepszy.tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W, b))
w swoim przypadku.b
musi znajdować się pozatf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W), b)
Krótka wersja:
Załóżmy, że masz dwa tensory, w których
y_hat
znajdują się obliczone wyniki dla każdej klasy (na przykład od y = W * x + b) iy_true
zawiera zakodowane na gorąco prawdziwe etykiety.Jeśli interpretujesz wyniki
y_hat
jako nietypowe prawdopodobieństwa dziennika, wówczas są to logity .Dodatkowo łączna strata entropijna obliczona w ten sposób:
jest zasadniczo równoważny całkowitej stracie entropijnej obliczonej z funkcją
softmax_cross_entropy_with_logits()
:Długa wersja:
W warstwie wyjściowej sieci neuronowej prawdopodobnie obliczysz tablicę, która zawiera wyniki klas dla każdego z twoich wystąpień treningowych, na przykład z obliczeń
y_hat = W*x + b
. Aby służyć jako przykład, poniżej stworzyłemy_hat
tablicę 2 x 3, w której wiersze odpowiadają instancjom szkoleniowym, a kolumny odpowiadają klasom. Tak więc tutaj są 2 instancje treningowe i 3 klasy.Zauważ, że wartości nie są znormalizowane (tzn. Wiersze nie sumują się do 1). Aby je znormalizować, możemy zastosować funkcję softmax, która interpretuje dane wejściowe jako nietypowe prawdopodobieństwa dziennika (aka logity ) i generuje znormalizowane prawdopodobieństwo liniowe.
Ważne jest, aby w pełni zrozumieć, co mówi wyjście softmax. Poniżej pokazałem tabelę, która wyraźniej przedstawia powyższy wynik. Można zauważyć, że na przykład prawdopodobieństwo, że instancja treningowa 1 będzie „klasą 2”, wynosi 0,619. Prawdopodobieństwa klasowe dla każdej instancji treningowej są znormalizowane, więc suma każdego wiersza wynosi 1,0.
Mamy teraz prawdopodobieństwa klasowe dla każdej instancji treningowej, gdzie możemy pobrać argmax () każdego wiersza, aby wygenerować ostateczną klasyfikację. Z góry możemy wygenerować, że instancja treningowa 1 należy do „klasy 2”, a instancja treningowa 2 należy do „klasy 1”.
Czy te klasyfikacje są prawidłowe? Musimy zmierzyć się z prawdziwymi etykietami z zestawu treningowego. Będziesz potrzebował zakodowanej na gorąco
y_true
tablicy, w której ponownie wiersze są instancjami szkoleniowymi, a kolumny klasami. Poniżej utworzyłem przykładowąy_true
tablicę z jednym rozgrzaniem, w której prawdziwa etykieta dla instancji szkoleniowej 1 to „Klasa 2”, a prawdziwa etykieta dla instancji szkoleniowej 2 to „Klasa 3”.Czy rozkład prawdopodobieństwa jest
y_hat_softmax
zbliżony do rozkładu prawdopodobieństway_true
? Możemy zmierzyć błąd za pomocą utraty entropii krzyżowej .Możemy obliczyć stratę między entropią na podstawie rzędów i zobaczyć wyniki. Poniżej widzimy, że instancja treningowa 1 straciła 0,479, a instancja treningowa 2 straciła 1,200. Ten wynik ma sens, ponieważ w naszym powyższym przykładzie
y_hat_softmax
pokazał, że największe prawdopodobieństwo wystąpienia szkolenia 1 dotyczyło „klasy 2”, co odpowiada wystąpieniu szkolenia 1y_true
; jednak przewidywanie dla przypadku treningowego 2 wykazało najwyższe prawdopodobieństwo dla „klasy 1”, która nie pasuje do prawdziwej klasy „klasy 3”.To, czego naprawdę chcemy, to całkowita strata we wszystkich instancjach treningowych. Możemy więc obliczyć:
Korzystanie z softmax_cross_entropy_with_logits ()
Zamiast tego możemy obliczyć całkowitą utratę entropii krzyżowej za pomocą
tf.nn.softmax_cross_entropy_with_logits()
funkcji, jak pokazano poniżej.Zauważ, że
total_loss_1
itotal_loss_2
generuj zasadniczo równoważne wyniki z pewnymi niewielkimi różnicami w końcowych cyfrach. Jednak równie dobrze możesz zastosować drugie podejście: wymaga ono o jeden mniej wiersza kodu i kumuluje mniej błędu numerycznego, ponieważ softmax jest wykonywany dla Ciebie wewnątrzsoftmax_cross_entropy_with_logits()
.źródło
M = tf.random.uniform([100, 10], minval=-1.0, maxval=1.0); labels = tf.one_hot(tf.random.uniform([100], minval=0, maxval=10 , dtype='int32'), 10); tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=M) - tf.reduce_sum(-tf.nn.log_softmax(M)*tf.one_hot(labels, 10), -1)
powraca blisko do zera wszędzietf.nn.softmax
oblicza propagację do przodu przez warstwę softmax. Używasz go podczas oceny modelu, gdy obliczasz prawdopodobieństwa, które daje model.tf.nn.softmax_cross_entropy_with_logits
oblicza koszt warstwy softmax. Jest używany tylko podczas treningu .Logity są niezormalizowanymi prawdopodobieństwami logarytmicznymi wyjściowymi dla modelu (wartości wyjściowe przed zastosowaniem do nich normalizacji softmax).
źródło
tf.nn.softmax_cross_entropy_with_logits
ocenę, jak bardzo model odbiega od złotych etykiet, a nie o znormalizowaną wydajność.tf.nn.sparse_softmax_cross_entropy_with_logits
. Aby uzyskać prawdopodobieństwa, użyjtf.nn.softmax
.Powyższe odpowiedzi mają wystarczający opis dla zadanego pytania.
Ponadto Tensorflow zoptymalizował operację zastosowania funkcji aktywacji, a następnie obliczenie kosztów za pomocą własnej aktywacji, a następnie funkcji kosztów. Dlatego dobrą praktyką jest stosowanie:
tf.nn.softmax_cross_entropy()
ponadtf.nn.softmax(); tf.nn.cross_entropy()
Widać wyraźną różnicę między nimi w modelu wymagającym dużych zasobów.
źródło
tf.nn.softmax
a następnietf.losses.softmax_cross_entropy
?softmax
Logit zawsze powtarza to, co J. Hinton cały czas powtarza w filmach z Coursera.źródło
Odpowiedź zgodna z Tensorflow 2.0 : Objaśnienia
dga
istackoverflowuser2010
szczegółowe informacje na temat Logitów i powiązanych funkcji.Wszystkie te funkcje, jeśli są używane w,
Tensorflow 1.x
będą działały poprawnie, ale jeśli migrujesz swój kod z1.x (1.14, 1.15, etc)
do2.x (2.0, 2.1, etc..)
za pomocą tych funkcji powodują błędu.Dlatego też określając wywołania zgodne z wersją 2.0 dla wszystkich funkcji, które omówiliśmy powyżej, jeśli przeprowadzamy migrację
1.x to 2.x
, z korzyścią dla społeczności.Funkcje w 1.x :
tf.nn.softmax
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
Odpowiednie funkcje po migracji z wersji 1.x do wersji 2.x :
tf.compat.v2.nn.softmax
tf.compat.v2.nn.softmax_cross_entropy_with_logits
tf.compat.v2.nn.sparse_softmax_cross_entropy_with_logits
Aby uzyskać więcej informacji na temat migracji z wersji 1.x do wersji 2.x, zapoznaj się z niniejszym przewodnikiem migracji .
źródło
Jeszcze jedna rzecz, którą zdecydowanie chciałbym podkreślić, ponieważ logit jest tylko surowym wyjściem, ogólnie wyjściem ostatniej warstwy. Może to być również wartość ujemna. Jeśli użyjemy go tak, jak to jest do oceny „entropii krzyżowej”, jak wspomniano poniżej:
to nie zadziała. Ponieważ log -ve nie jest zdefiniowany. Tak więc użycie aktywacji softmax rozwiąże ten problem.
Tak rozumiem, popraw mnie, jeśli się mylę.
źródło