Sparse_softmax_cross_entropy_with_logits ve softmax_cross_entropy_with_logits arasındaki fark nedir?


111

Geçenlerde tf.nn.sparse_softmax_cross_entropy_with_logits ile karşılaştım ve tf.nn.softmax_cross_entropy_with_logits ile karşılaştırıldığında farkın ne olduğunu anlayamıyorum .

Eğitim vektörler o tek fark mı yolmak zorunda tek sıcak kodlanmış kullanırken sparse_softmax_cross_entropy_with_logits?

API'yi okurken, ile karşılaştırıldığında başka bir fark bulamadım softmax_cross_entropy_with_logits. Ama o halde neden ekstra işleve ihtiyacımız var?

Tek çalışırken kodlanmış eğitim verileri / vektörleri ile sağlanmışsa softmax_cross_entropy_with_logitsaynı sonuçları vermemeli sparse_softmax_cross_entropy_with_logitsmi?


1
Her ikisi de kullanılabiliyorsa performanslarının bir karşılaştırmasını görmekle ilgileniyorum (örneğin, özel resim etiketleri ile); Seyrek sürümün en azından bellek açısından daha verimli olmasını beklerdim.
Yibo Yang

1
Ayrıca tensorflow'daki tüm çapraz entropi fonksiyonlarını tartışan bu soruya da bakın (bunların birçoğu olduğu ortaya çıktı).
Maxim

Yanıtlar:


175

Aynı sonucu ürettikleri için iki farklı işleve sahip olmak bir rahatlıktır .

Aradaki fark basit:

  • Çünkü sparse_softmax_cross_entropy_with_logits, etiketler [batch_size] şeklinde ve dtype int32 veya int64 olmalıdır. Her etiket, aralıkta bir tamsayıdır [0, num_classes-1].
  • İçin softmax_cross_entropy_with_logits, etiketlerin [batch_size, num_classes] şeklinde ve dtype float32 veya float64 olmalıdır.

Kullanılan etiketler softmax_cross_entropy_with_logitsolan bir sıcak versiyonu kullanılan etiketlerin sparse_softmax_cross_entropy_with_logits.

Bir diğer küçük fark ise , bu etiket üzerinde sparse_softmax_cross_entropy_with_logitskayıp olması için etiket olarak -1 verebilmenizdir 0.


15
-1 doğru mu? Dokümantasyonda belirtildiği gibi: "Etiketlerdeki her giriş, [0, sınıf_sınıfları) içindeki bir dizin olmalıdır. Diğer değerler, bu işlem CPU üzerinde çalıştırıldığında bir istisna oluşturacak ve GPU'da karşılık gelen kayıp ve gradyan satırları için NaN'yi döndürecektir."
user1761806

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

24

TF belgelerinde de bulabileceğiniz kabul edilen yanıtlara 2 şey eklemek istiyorum.

İlk:

tf.nn.softmax_cross_entropy_with_logits

NOT: Sınıflar birbirini dışlamasına rağmen olasılıklarının olması gerekmez. Gereken tek şey, her bir etiket satırının geçerli bir olasılık dağılımı olmasıdır. Değilse, gradyan hesaplaması yanlış olacaktır.

İkinci:

tf.nn.sparse_softmax_cross_entropy_with_logits

NOT: Bu işlem için, belirli bir etiketin olasılığı münhasır olarak kabul edilir. Yani, yumuşak sınıflara izin verilmez ve etiket vektörü, her günlük satırı (her bir mini parti girişi) için gerçek sınıf için tek bir özel dizin sağlamalıdır.


4
Sınıflar birbirini dışlamıyorsa ne kullanmalıyız? Yani birden fazla kategorik etiketi birleştiriyorsak?
Hayro

Bunu da okudum. Yani sınıf olasılığını, onu tek bir vektör olarak almak yerine çapraz entropiye uyguladığımız anlamına gelir.
shamane Siriwardhana

@Hayro - Bir sıcak kodlama yapamayacağınızı mı söylüyorsunuz? Bence farklı bir modele bakman gerekecek. Bu, "4 ikili lojistik regresyon sınıflandırıcı oluşturmak daha uygun olur" gibi bir şeyden bahsetti. Öncelikle sınıfları ayırabildiğinizden emin olmak için.
ashley

21

Her iki işlev de aynı sonuçları hesaplar ve sparse_softmax_cross_entropy_with_logits , çapraz entropiyi tek sıcak kodlama ile dönüştürmek yerine seyrek etiketler üzerinde doğrudan hesaplar .

Aşağıdaki programı çalıştırarak bunu doğrulayabilirsiniz:

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

Burada rastgele bir logitsuzunluk vektörü dimsoluşturuyorum ve tek sıcak kodlanmış etiketler oluşturuyorum (burada eleman pos1 ve diğerleri 0'dır).

Bundan sonra softmax ve seyrek softmax hesaplayıp çıktılarını karşılaştırıyorum. Her zaman aynı çıktıyı ürettiğinden emin olmak için birkaç kez yeniden çalıştırmayı deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.