[PYTHON] sparse_softmax_cross_entropy_with_logits를 사용하여 tensorflow에서 가중 크로스 엔트로피 손실을 구현하려면 어떻게해야합니까?
PYTHONsparse_softmax_cross_entropy_with_logits를 사용하여 tensorflow에서 가중 크로스 엔트로피 손실을 구현하려면 어떻게해야합니까?
나는 tensorflow (Caffe에서 온)를 사용하기 시작했으며 sparse_softmax_cross_entropy_with_logits의 손실을 사용하고 있습니다. 이 함수는 onehot 인코딩 대신에 0,1, ... C-1 같은 레이블을 받아들입니다. 이제 클래스 레이블에 따라 가중치를 사용하고 싶습니다. 나는 이것이 softmax_cross_entropy_with_logits (하나의 핫 인코딩)을 사용하는 경우 행렬 곱셈으로 수행 될 수 있음을 알고 있습니다. sparse_softmax_cross_entropy_with_logits를 사용하여 동일한 작업을 수행 할 수있는 방법이 있습니까?
해결법
-
==============================
1.
import tensorflow as tf import numpy as np np.random.seed(123) sess = tf.InteractiveSession() # let's say we have the logits and labels of a batch of size 6 with 5 classes logits = tf.constant(np.random.randint(0, 10, 30).reshape(6, 5), dtype=tf.float32) labels = tf.constant(np.random.randint(0, 5, 6), dtype=tf.int32) # specify some class weightings class_weights = tf.constant([0.3, 0.1, 0.2, 0.3, 0.1]) # specify the weights for each sample in the batch (without having to compute the onehot label matrix) weights = tf.gather(class_weights, labels) # compute the loss tf.losses.sparse_softmax_cross_entropy(labels, logits, weights).eval()
-
==============================
2.특히 이진 분류의 경우 가중치가있는 softmax 교차 엔트로피를 계산하는 weighted_cross_entropy_with_logits가 있습니다.
특히 이진 분류의 경우 가중치가있는 softmax 교차 엔트로피를 계산하는 weighted_cross_entropy_with_logits가 있습니다.
sparse_softmax_cross_entropy_with_logits는 고효율 가중치가없는 작업 (SparseXoftEigenImpl을 사용하는 SparseSoftmaxXentWithLogitsOp 참조)을 위해 꼬리표가 붙여져 있으므로 "플러그 가능"하지 않습니다.
다중 클래스의 경우 옵션은 one-hot 인코딩으로 전환하거나 이미 제안 된 것처럼 hacky 방식으로 tf.losses.sparse_softmax_cross_entropy 손실 함수를 사용합니다. 현재 배치의 레이블에 따라 가중치를 전달해야합니다 .
-
==============================
3.클래스 가중치에 로그가 곱해 지므로 sparse_softmax_cross_entropy_with_logits에 대해 여전히 작동합니다. "Tensor 플로우에서 클래스 불균형 2 진 분류기의 손실 함수"에 대해서는이 솔루션을 참조하십시오.
클래스 가중치에 로그가 곱해 지므로 sparse_softmax_cross_entropy_with_logits에 대해 여전히 작동합니다. "Tensor 플로우에서 클래스 불균형 2 진 분류기의 손실 함수"에 대해서는이 솔루션을 참조하십시오.
보조 메모로 sparse_softmax_cross_entropy에 직접 가중치를 전달할 수 있습니다.
tf.contrib.losses.sparse_softmax_cross_entropy(logits, labels, weight=1.0, scope=None)
이 방법은 다음을 사용하여 교차 엔트로피 손실에 사용됩니다.
tf.nn.sparse_softmax_cross_entropy_with_logits.
무게는 손실의 계수 역할을합니다. 스칼라가 제공되면, 손실은 단순히 주어진 값에 의해 스케일됩니다. 가중치가 [batch_size] 크기의 텐서라면, 손실 가중치는 각각의 해당 샘플에 적용됩니다.
from https://stackoverflow.com/questions/40198364/how-can-i-implement-a-weighted-cross-entropy-loss-in-tensorflow-using-sparse-sof by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 fft bandpass 필터 (0) | 2018.11.18 |
---|---|
[PYTHON] utf8 문제가있는 파이썬 정규식 (0) | 2018.11.18 |
[PYTHON] 파이썬 서브 프로세스의 파일 기술자 3에 쓴다. 객체를 열어 라. (0) | 2018.11.18 |
[PYTHON] 파이썬 - 특정 클래스에 의해 시작된 활성 스레드 수를 얻는 방법? (0) | 2018.11.18 |
[PYTHON] Canvas에서 이미지를 업데이트하는 방법은 무엇입니까? (0) | 2018.11.18 |