나는 여기서 tensorflow API 문서를 겪고있었습니다 . tensorflow 문서에서이라는 키워드를 사용했습니다 logits
. 무엇입니까? API 문서의 많은 메소드에서 다음과 같이 작성됩니다.
tf.nn.softmax(logits, name=None)
쓰여진 내용 logits
만 있는 것이라면 Tensors
왜 다른 이름을 유지 logits
하는가?
또 다른 것은 내가 구별 할 수없는 두 가지 방법이 있다는 것입니다. 그들은
tf.nn.softmax(logits, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
그들 사이의 차이점은 무엇입니까? 문서가 명확하지 않습니다. 나는 무엇을 알고 tf.nn.softmax
있습니다. 그러나 다른 것은 아닙니다. 예가 정말 도움이 될 것입니다.
답변
로 짓은 단순히 함수가 이전 레이어의 스케일되지 않은 출력에서 작동하고 단위를 이해하기위한 상대적인 스케일이 선형이라는 것을 의미합니다. 이는 특히 입력의 합이 1과 같지 않아 값이 확률 이 아님 을 의미합니다 (입력이 5 일 수 있음).
tf.nn.softmax
softmax 기능 을 입력 텐서 에 적용한 결과 만 생성합니다 . softmax는 sum(input) = 1
다음과 같이 입력을 “정지”합니다 . 이는 정상화 방법입니다. softmax의 출력 형태는 입력과 동일합니다. 값만 정규화합니다. softmax의 출력은 확률로 해석 될 수 있습니다.
a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508 0.205666 0.25120102 0.37474789]]
반대로 tf.nn.softmax_cross_entropy_with_logits
softmax 함수를 적용한 후 결과의 교차 엔트로피를 계산합니다 (그러나 수학적으로 더 신중하게 계산 함). 다음의 결과와 유사합니다.
sm = tf.nn.softmax(x)
ce = cross_entropy(sm)
교차 엔트로피는 요약 메트릭입니다. 요소 전체의 합계입니다. tf.nn.softmax_cross_entropy_with_logits
모양 [2,5]
텐서 의 출력은 모양입니다 [2,1]
(첫 번째 차원은 배치로 처리됨).
당신이 교차 엔트로피를 최소화하기 위해 최적화를 수행하려는 경우 와 당신이 당신의 마지막 레이어 후 softmaxing하고, 당신은 사용해야 tf.nn.softmax_cross_entropy_with_logits
는 수학적으로 올바른 방법으로 수치 적으로 불안정 코너 케이스를 다루고 있기 때문에, 대신 스스로 일을. 그렇지 않으면 여기 저기에 작은 엡실론을 추가하여 해킹하게됩니다.
편집 2016-02-07 :
객체가 하나의 클래스에만 속할 수있는 단일 클래스 레이블이있는 경우 tf.nn.sparse_softmax_cross_entropy_with_logits
레이블을 고밀도 one-hot 배열로 변환하지 않아도되도록 사용 하는 것이 좋습니다. 이 기능은 0.6.0 릴리스 이후에 추가되었습니다.
답변
짧은 버전 :
y_hat
각 클래스에 대해 계산 된 점수 (예 : y = W * x + b)와 y_true
하나의 핫 인코딩 된 실제 레이블 이 포함 된 두 개의 텐서가 있다고 가정합니다 .
y_hat = ... # Predicted label, e.g. y = tf.matmul(X, W) + b
y_true = ... # True label, one-hot encoded
당신이 점수를 해석하면 y_hat
표준화 로그 확률로, 그 후에는 logits .
또한 다음과 같이 계산 된 총 교차 엔트로피 손실 :
y_hat_softmax = tf.nn.softmax(y_hat)
total_loss = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), [1]))
본질적으로 다음 함수로 계산 된 총 교차 엔트로피 손실과 softmax_cross_entropy_with_logits()
같습니다.
total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
긴 버전 :
신경망의 출력 레이어에서 계산과 같은 각 트레이닝 인스턴스에 대한 클래스 점수를 포함하는 배열을 계산할 수 있습니다 y_hat = W*x + b
. 예를 들어 아래 y_hat
에서 2 x 3 배열로 만들었습니다. 여기서 행은 교육 인스턴스에 해당하고 열은 클래스에 해당합니다. 여기에 2 개의 훈련 인스턴스와 3 개의 수업이 있습니다.
import tensorflow as tf
import numpy as np
sess = tf.Session()
# Create example y_hat.
y_hat = tf.convert_to_tensor(np.array([[0.5, 1.5, 0.1],[2.2, 1.3, 1.7]]))
sess.run(y_hat)
# array([[ 0.5, 1.5, 0.1],
# [ 2.2, 1.3, 1.7]])
값은 정규화되지 않습니다 (예 : 행의 합이 1이 아님). 정규화하기 위해 입력을 정규화되지 않은 로그 확률 (일명 logits ) 로 해석하고 정규화 된 선형 확률을 출력 하는 softmax 함수를 적용 할 수 있습니다 .
y_hat_softmax = tf.nn.softmax(y_hat)
sess.run(y_hat_softmax)
# array([[ 0.227863 , 0.61939586, 0.15274114],
# [ 0.49674623, 0.20196195, 0.30129182]])
softmax 출력의 내용을 완전히 이해하는 것이 중요합니다. 아래에는 위의 출력을보다 명확하게 나타내는 표가 나와 있습니다. 예를 들어, 훈련 인스턴스 1이 “클래스 2″일 확률은 0.619임을 알 수있다. 각 교육 인스턴스의 클래스 확률은 정규화되므로 각 행의 합계는 1.0입니다.
Pr(Class 1) Pr(Class 2) Pr(Class 3)
,--------------------------------------
Training instance 1 | 0.227863 | 0.61939586 | 0.15274114
Training instance 2 | 0.49674623 | 0.20196195 | 0.30129182
이제 각 훈련 인스턴스에 대한 클래스 확률이 있으며, 여기서 각 행의 argmax ()를 사용하여 최종 분류를 생성 할 수 있습니다. 위에서 우리는 훈련 인스턴스 1이 “클래스 2″에 속하고 훈련 인스턴스 2가 “클래스 1″에 속한다는 것을 생성 할 수 있습니다.
이러한 분류가 정확합니까? 훈련 세트의 실제 레이블을 기준으로 측정해야합니다. one-hot 인코딩 y_true
배열 이 필요합니다 . 여기서 행은 학습 인스턴스이고 열은 클래스입니다. 아래에서는 y_true
교육 인스턴스 1의 실제 레이블이 “클래스 2″이고 교육 인스턴스 2의 실제 레이블이 “클래스 3″인 one-hot 배열 의 예를 만들었습니다 .
y_true = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
sess.run(y_true)
# array([[ 0., 1., 0.],
# [ 0., 0., 1.]])
확률 분포는 확률 분포와 y_hat_softmax
비슷 y_true
합니까? 교차 엔트로피 손실 을 사용하여 오류를 측정 할 수 있습니다 .
교차 엔트로피 손실을 행 단위로 계산하고 결과를 볼 수 있습니다. 아래에서 훈련 인스턴스 1의 손실은 0.479이고 훈련 인스턴스 2의 손실은 1.200입니다. 위의 예에서 y_hat_softmax
훈련 인스턴스 1의 가장 높은 확률은 “클래스 2″일 가능성이 있음을 보여 주었 으므로이 결과는 의미 가 있습니다 y_true
. 그러나 훈련 사례 2에 대한 예측은 “클래스 1″에 대한 확률이 가장 높았으며 이는 실제 클래스 “클래스 3″과 일치하지 않습니다.
loss_per_instance_1 = -tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1])
sess.run(loss_per_instance_1)
# array([ 0.4790107 , 1.19967598])
우리가 정말로 원하는 것은 모든 교육 인스턴스에 대한 총 손실입니다. 따라서 다음을 계산할 수 있습니다.
total_loss_1 = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1]))
sess.run(total_loss_1)
# 0.83934333897877944
softmax_cross_entropy_with_logits () 사용
대신 tf.nn.softmax_cross_entropy_with_logits()
아래와 같이 함수를 사용하여 총 교차 엔트로피 손실을 계산할 수 있습니다.
loss_per_instance_2 = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
sess.run(loss_per_instance_2)
# array([ 0.4790107 , 1.19967598])
total_loss_2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
sess.run(total_loss_2)
# 0.83934333897877922
참고 그 total_loss_1
와 total_loss_2
매우 마지막 자리에서 몇 가지 작은 차이와 생산 본질적으로 동등한 결과. 그러나 두 번째 방법을 사용할 수도 있습니다. softmax가 내부에서 수행되기 때문에 코드 한 줄이 덜 걸리고 수치 오류가 적습니다 softmax_cross_entropy_with_logits()
.
답변
tf.nn.softmax
softmax 레이어를 통한 순방향 전파를 계산합니다. 모형이 출력하는 확률을 계산할 때 모형을 평가 하는 동안 이 모형을 사용합니다.
tf.nn.softmax_cross_entropy_with_logits
softmax 레이어의 비용을 계산합니다. 훈련 중에 만 사용됩니다 .
로 짓은 모형을 출력하는 정규화 되지 않은 로그 확률 (softmax 정규화가 적용되기 전에 출력 된 값)입니다.
답변
위의 답변에는 질문에 대한 설명이 충분합니다.
또한 Tensorflow는 활성화 기능을 적용한 다음 자체 활성화를 사용하여 비용을 계산하고 비용 함수를 계산하는 작업을 최적화했습니다. 따라서 그것은 사용하기 좋은 연습은 다음과 같습니다 tf.nn.softmax_cross_entropy()
이상tf.nn.softmax(); tf.nn.cross_entropy()
자원 집약적 모델에서 이들 간의 현저한 차이를 찾을 수 있습니다.
답변
무엇 적으로 이동하는 softmax
로짓이며,이 J. 힌튼은 코 세라 비디오의 모든 시간을 반복하는 것이다.
답변
Tensorflow 2.0 호환 답변 : Logits 및 관련 기능에 대한 설명 dga
과 stackoverflowuser2010
자세한 내용입니다.
사용되는 모든 함수 Tensorflow 1.x
는 정상적으로 작동하지만 코드를에서 (으) 1.x (1.14, 1.15, etc)
로 마이그레이션 2.x (2.0, 2.1, etc..)
하면 해당 함수를 사용하면 오류가 발생합니다.
따라서 모든 기능에 대해 2.0 호환 호출을 지정 1.x to 2.x
하면 커뮤니티의 이익을 위해 위에서 마이그레이션 한 경우 위에서 논의했습니다 .
1.x의 기능 :
tf.nn.softmax
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
1.x에서 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
1.x에서 2.x 로의 마이그레이션에 대한 자세한 내용은이 마이그레이션 안내서 를 참조하십시오 .
답변
logit으로 분명히 강조하고 싶은 또 하나의 것은 단지 원시 출력, 일반적으로 마지막 레이어의 출력입니다. 음수 값이 될 수도 있습니다. 아래에 언급 된대로 “교차 엔트로피”평가를 위해 사용하는 경우 :
-tf.reduce_sum(y_true * tf.log(logits))
그런 다음 작동하지 않습니다. -ve의 로그가 정의되지 않았습니다. 따라서 o softmax 활성화를 사용하면이 문제를 극복 할 수 있습니다.
이것은 나의 이해입니다. 만약 내가 틀렸다면 정정하십시오.