Garfield
YZF Admin
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
İki sınıflı bir problemde bile iki yaygın seçenek vardır. Çıktıyı
Aşağıdaki ayrım, loss fonksiyonuna hangi tensörleri vereceğinizi belirler:
Mini gruplu girdilerde sınıf ekseni ikinci boyutta, yani
Sınıf indeksleri kullanıyorsanız hedefte her eleman,
Aşağıdaki varsayımsal örnekte üç sınıf ve iki eğitim örneği vardır. Model iki satır logits üretir; hedefte
İlk satırda en büyük logit
Modeliniz her örnek için
Loss çağrısından önce
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:
| Problem | Model çı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ı |
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 üzerindesoftmax(dim=0)kullanın; loss’a ham logits verilir. - Hedefi one-hot biçiminde vermek: Sınıf indeksleri kullanıyorsanız hedef
(N)vetorch.longolmalı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. Gerekirsepermuteile sınıf eksenini ikinci konuma taşıyın. - Hedefte
floatkullanmak: Sınıf numaralarıyla çalışırken hedefitorch.longyapın.floathedef, 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: