F.cross_entropy og F.binary_cross_entropy_with_logits
F Cross_entropy F
Klassen som tilsvarer funksjonen F.cross_entropy er fakkel.nn.CrossEntropyLoss, som automatisk vil legge til logsoftmax og deretter beregne tapet når det brukes (faktisk er det sammensmeltingen av nn.LogSoftmax () og nn.NLLLoss ())
Denne funksjonen brukes til å beregne kryssentropi-tap av multiklassifiseringsproblemer
Funksjonsform:
Denne formen er bedre å forstå
C er antall klasser
inngang 1-dimensjonalt tilfelle x [N, C] n-dimensjonalt tilfelle [N, c, d1, d2, d3 ...]
mål 1 dimensjonssak [N] n dimensjonssak [N, C, d1, d2, d3] Dette verdiområdet må være 0-C-1
vekt [C] representerer vekten til hver kategori
Merk at målet her må være av lang type
Vekten her er en vekt for hver kategori
Under normale omstendigheter (standard) vil tapet av alle elementene bli gjennomsnittet, så den endelige tapformelen er
Wn representerer vekten til den tilsvarende gt-kategorien til den nte prøven, og Pn er sannsynligheten for den tilsvarende gt-kategorien som er forutsagt av modellen. Legg til tapet av alle prøvene på telleren, og del deretter med summen av alle prøvevektene.
import numpy as np import torch from torch.nn import functional as F x = np.array([[1, 2], [1, 2], [1, 1]]).astype(np.float32) y = np.array([1, 1, 0]) weight = np.array([2, 1]) x = torch.from_numpy(x) print(F.softmax(x, dim=1)) y = torch.from_numpy(y).long() weight = torch.from_numpy(weight).float() loss = F.cross_entropy(x, y, weight=weight) print(loss)
Manuell beregning
Den tilsvarende klassen av F.binary_cross_entropy_with_logits () er fakkel.nn.BCEWithLogitsLoss, som automatisk vil legge til sigmoid når du bruker, og deretter beregne tap. (Faktisk er det en kombinasjon av nn.sigmoid og nn.BCELoss)
Denne funksjonen brukes til å beregne kryssentropi-tap av multiklassifiseringsproblemer
her
inngang [N, *]
mål [N, *]
Målet her må være av typen float
Her er et eksempel på nn.BCELoss direkte. Merk at når du bruker nn.BCELoss, må du sørge for at inngangen er sannsynlighetsverdien for sigmoidaktivering
Vekten her er en vekt for hvert punkt
import torch from torch import nn def binary_cross_entropyloss(prob, target, weight=None): loss = -weight * (target * torch.log(prob) + (1 - target) * (torch.log(1 - prob))) loss = torch.sum(loss) / torch.numel(target) return loss label = torch.tensor([ [1., 0], [1., 0], ]) predict = torch.tensor([ [0.1, 0.3], [0.2, 0.8] ]) weight1 = torch.tensor([ [1., 2], [1., 1.], ]) loss1 = nn.BCELoss(weight=weight1) l1 = loss1(predict, label) loss = binary_cross_entropyloss(predict, label, weight=weight1) print(l1, loss)