sparse_softmax_cross_entropy_with_logits와 softmax_cross_entropy_with_logits의 차이점은 무엇입니까?


111

나는 최근에 tf.nn.sparse_softmax_cross_entropy_with_logits발견 했고 그 차이가 tf.nn.softmax_cross_entropy_with_logits 와 비교되는 것을 알 수 없습니다 .

y를 사용할 때 훈련 벡터 가 원-핫 인코딩 되어야 한다는 유일한 차이점은 sparse_softmax_cross_entropy_with_logits무엇입니까?

API를 읽으면서 .NET과 비교하여 다른 차이점을 찾을 수 없습니다 softmax_cross_entropy_with_logits. 그런데 왜 추가 기능이 필요한가요?

원-핫 인코딩 된 학습 데이터 / 벡터와 함께 제공되는 경우 softmax_cross_entropy_with_logits와 동일한 결과를 생성 하지 않아야 sparse_softmax_cross_entropy_with_logits합니까?


1
둘 다 사용할 수있는 경우 성능 비교를보고 싶습니다 (예 : 독점 이미지 레이블 사용). 나는 희소 버전이 적어도 메모리 측면에서 더 효율적일 것으로 기대합니다.
Yibo Yang

1
tensorflow의 모든 교차 엔트로피 함수 를 논의하는 this question을 참조하십시오 (많은 것으로 밝혀졌습니다).
Maxim

답변:


175

두 가지 다른 기능을 갖는 것은 동일한 결과를 생성하므로 편리합니다 .

차이점은 간단합니다.

  • 의 경우 sparse_softmax_cross_entropy_with_logits레이블의 모양은 [batch_size]이고 dtype은 int32 또는 int64 여야합니다. 각 레이블은 범위 내의 정수입니다 [0, num_classes-1].
  • 의 경우 softmax_cross_entropy_with_logits레이블은 [batch_size, num_classes] 및 dtype float32 또는 float64 모양이어야합니다.

에서 사용되는 라벨은 softmax_cross_entropy_with_logits있습니다 핫 버전 에 사용 된 레이블 sparse_softmax_cross_entropy_with_logits.

또 다른 작은 차이점은를 사용 sparse_softmax_cross_entropy_with_logits하면 -1을 레이블로 제공 0하여이 레이블에 손실 을 줄 수 있다는 것 입니다.


15
-1이 맞습니까? 문서에서 "라벨의 각 항목은 [0, num_classes)의 인덱스 여야합니다. 다른 값은이 작업이 CPU에서 실행될 때 예외를 발생시키고 GPU의 해당 손실 및 그래디언트 행에 대해 NaN을 반환합니다."
user1761806 aug

1
[0, num_classes) = 0, num_classes-1]
KARTHIK C

24

TF 문서에서도 찾을 수있는 수락 된 답변에 두 가지를 추가하고 싶습니다.

먼저:

tf.nn.softmax_cross_entropy_with_logits

참고 : 클래스는 상호 배타적이지만 확률은 그럴 필요가 없습니다. 필요한 것은 레이블의 각 행이 유효한 확률 분포라는 것입니다. 그렇지 않은 경우 그래디언트 계산이 잘못됩니다.

둘째:

tf.nn.sparse_softmax_cross_entropy_with_logits

참고 :이 작업에서는 지정된 레이블의 확률이 배타적 인 것으로 간주됩니다. 즉, 소프트 클래스는 허용되지 않으며 레이블 벡터는 각 로짓 행 (각 미니 배치 항목)의 실제 클래스에 대한 단일 특정 인덱스를 제공해야합니다.


4
클래스가 상호 배타적이지 않은 경우 무엇을 사용해야합니까? 여러 개의 카테고리 레이블을 결합한다면?
Hayro

나는 또한 이것을 읽었다. 그래서 그것은 우리가 그것을 onehot 벡터로 취하는 것이 아니라 교차 엔트로피에 클래스 확률을 적용한다는 것을 의미합니다.
Shamane Siriwardhana

@Hayro-핫 인코딩을 할 수 없다는 뜻입니까? 다른 모델을 봐야 할 것 같아요. 이것은 "4 개의 이진 로지스틱 회귀 분류기를 구축하는 것이 더 적절할 것입니다"와 같이 언급했습니다. 먼저 클래스를 분리 할 수 ​​있는지 확인하십시오.
애슐리

21

두 함수 모두 동일한 결과를 계산 하고 sparse_softmax_cross_entropy_with_logits원-핫 인코딩 으로 변환하는 대신 희소 레이블에서 직접 교차 엔트로피를 계산합니다 .

다음 프로그램을 실행하여이를 확인할 수 있습니다.

import tensorflow as tf
from random import randint

dims = 8
pos  = randint(0, dims - 1)

logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32)
labels = tf.one_hot(pos, dims)

res1 = tf.nn.softmax_cross_entropy_with_logits(       logits=logits, labels=labels)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos))

with tf.Session() as sess:
    a, b = sess.run([res1, res2])
    print a, b
    print a == b

여기서 logits길이 의 임의의 벡터를 만들고 dims원-핫 인코딩 된 레이블을 생성합니다 (여기서 요소 pos는 1이고 다른 요소 는 0).

그 후 소프트 맥스와 스파 스 소프트 맥스를 계산하고 출력을 비교합니다. 항상 동일한 출력을 생성하도록 몇 번 다시 실행 해보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.