• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

PyTorch CrossEntropyLoss nedir ve uygun girdi biçimi nasıl seçilir?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni
PyTorch’ta CrossEntropyLoss, çok sınıflı sınıflandırmada modelin ürettiği ham logits ile doğru sınıfı karşılaştırır. En yaygın kullanımda modele softmax eklemez, hedefleri sınıf numarası olarak verir ve çıktı biçimini (N, C) tutarsınız: N örnek sayısı, C sınıf sayısıdır. Piksel veya zaman adımı gibi ek boyutlar varsa çıktı (N, C, d1, ...), hedef ise (N, d1, ...) olur. Bu ayrımı doğru yaptığınızda kayıp değeri hesaplanır; yanlış sınıf ekseni veya yanlış hedef türü ise boyut ve tür hatalarına yol açar.

CrossEntropyLoss ne hesaplar?​


torch.nn.CrossEntropyLoss, pratikte LogSoftmax ile NLLLoss işlemlerini birleştirir. Bu nedenle modelin son katmanından çıkan değerler olasılık değil, normalize edilmemiş logits olmalıdır. Modelin sonuna ayrıca Softmax koymak genellikle gereksizdir ve sayısal kararlılığı bozabilir.

İki sınıflı bir problemde bile iki yaygın seçenek vardır. Çıktıyı (N, 2) üretip CrossEntropyLoss kullanabilir veya tek logitli (N) çıktı ile BCEWithLogitsLoss kullanabilirsiniz. CrossEntropyLoss seçtiğinizde yaygın seçenek, her örnek için iki sınıftan birinin numarasını vermektir. İki sınıfa ait geçerli bir olasılık dağılımı içeren, logits ile aynı biçimde kayan noktalı hedefler de desteklenir.

Girdi ve hedef biçimini nasıl seçmelisiniz?​


Aşağıdaki ayrım, loss fonksiyonuna hangi tensörleri vereceğinizi belirler:
ProblemModel çıktısı (input)Hedef (target)Hedef türü
Tek örnek sınıflandırma(C)İndeks için skaler (); olasılık için (C)İndeks: torch.long; olasılık: kayan noktalı
Mini grup sınıflandırma(N, C)İndeks için (N); olasılık için (N, C)İndeks: torch.long; olasılık: kayan noktalı
Görüntü segmentasyonu(N, C, H, W)İndeks için (N, H, W); olasılık için (N, C, H, W)İndeks: torch.long; olasılık: kayan noktalı
Ek boyutlu sınıflandırma(N, C, d1...)İndeks için (N, d1...); olasılık için girdiyle aynı biçimİndeks: torch.long; olasılık: kayan noktalı
Mini gruplu girdilerde sınıf ekseni ikinci boyutta, yani C konumundadır. Grupsuz tek örneğin (C) girdisinde ise sınıf ekseni tek eksen olan dim=0 konumundadır. Örneğin segmentasyonda (N, H, W, C) üreten bir modeliniz varsa tensörü loss’a vermeden önce sınıf eksenini (N, C, H, W) biçimine taşımanız gerekir.

Sınıf indeksleri kullanıyorsanız hedefte her eleman, 0 ile C-1 arasında bir sınıf numarasıdır ve hedef tensörü torch.long olmalıdır. Hedefte sınıf olasılıkları kullanıyorsanız hedef, model çıktısıyla aynı biçimde olmalı ve her konumdaki değerler geçerli bir dağılımı temsil etmelidir. Ancak normal ve tek etiketli sınıflandırmada sınıf indeksleri daha basit ve daha az hata eğilimlidir.

En küçük çalışan örnek​


Aşağıdaki varsayımsal örnekte üç sınıf ve iki eğitim örneği vardır. Model iki satır logits üretir; hedefte 1 ve 0 sınıfları doğrudur.

Python:
import torch
import torch.nn as nn

criterion = nn.CrossEntropyLoss()

logits = torch.tensor([
    [2.0, 4.0, 1.0],
    [3.0, 0.5, 1.0]
])                         # biçim: (N=2, C=3)

target = torch.tensor([1, 0], dtype=torch.long)  # biçim: (N=2)

loss = criterion(logits, target)
print(loss.item())

İlk satırda en büyük logit 4.0 olduğu için modelin tahmini sınıf 1’dir ve hedef de 1 olduğundan bu örnek doğru sınıfa yöneliktir. İkinci satırda en büyük logit 3.0 ile sınıf 0 seçilir; hedef de 0’dır. Kayıp değerinin düşük olması bu iki örnekteki tahminlerin hedef sınıflarla uyumlu olduğunu gösterir; tek başına modelin genelleme başarısını kanıtlamaz. Bunun için doğrulama verisindeki sonuçları ayrıca ölçmeniz gerekir.

En sık yapılan biçim hataları​

  • Softmax çıktısını tekrar vermek: Model çıktısını olasılığa çevirmeden doğrudan CrossEntropyLoss’a verin. Tahmin olasılığı göstermek için mini gruplu logits üzerinde softmax(dim=1), grup içermeyen (C) logits üzerinde softmax(dim=0) kullanın; loss’a ham logits verilir.
  • Hedefi one-hot biçiminde vermek: Sınıf indeksleri kullanıyorsanız hedef (N) ve torch.long olmalıdır; (N, C) one-hot tensör kullanacaksanız bunun yerine olasılık-hedef biçiminin koşullarını karşılamalısınız.
  • Sınıf eksenini yanlış yere koymak: (N, C, H, W) beklenen segmentasyon çıktısını (N, H, W, C) biçiminde vermeyin. Gerekirse permute ile sınıf eksenini ikinci konuma taşıyın.
  • Hedefte float kullanmak: Sınıf numaralarıyla çalışırken hedefi torch.long yapın. float hedef, ancak olasılık dağılımı hedefi kullanıyorsanız anlamlıdır.

Seçim için kısa kural​


Modeliniz her örnek için C sınıftan birini seçiyorsa input=(N, C), target=(N) ve hedef türü long kullanın. Her piksel, zaman adımı veya ek konum için sınıf seçiyorsanız input=(N, C, d1, ...) ve target=(N, d1, ...) biçimine geçin. Çok etiketli sınıflandırmada bir örnek aynı anda birden fazla bağımsız etikete sahip olabiliyorsa CrossEntropyLoss yerine genellikle her etiket için bağımsız logits kullanan BCEWithLogitsLoss değerlendirilir; çünkü bu problem tek bir sınıf seçme problemi değildir.

Loss çağrısından önce logits.shape, target.shape ve target.dtype değerlerini yazdırarak kontrol edin. Sınıf indeksli mini grup kullanımında sınıf sayısı logits’in ikinci boyutundadır, hedef şekli sınıf boyutunu içermez ve indeksler 0 ile C-1 arasındadır. Grupsuz girdide logits (C), indeks hedefi skalerdir. Olasılık hedefleri ise kayan noktalı ve logits ile aynı biçimde olmalıdır; sınıf ekseninde değerlerin negatif olmadığını ve toplamlarının 1 olduğunu ayrıca kontrol edin. PyTorch bu dağılım koşullarını otomatik olarak doğrulamaz.
 
Son düzenleme:

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic
Geri
Üst