복붙노트

[PYTHON] sparse_softmax_cross_entropy_with_logits를 사용하여 tensorflow에서 가중 크로스 엔트로피 손실을 구현하려면 어떻게해야합니까?

PYTHON

sparse_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. ==============================

    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. ==============================

    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. ==============================

    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] 크기의 텐서라면, 손실 가중치는 각각의 해당 샘플에 적용됩니다.

  4. 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