Comprender el significado de Pytorch dentro nn.CrossEntropyLoss
Nn.CrossEntropyLoss dicho primer parámetro, si la salida de la salida de la red neuronal es un (batch_size, num_class, h, w) de Tensor (en la que, num_class representativo del número de categorías de clasificación, h es la altura de la imagen, w es el ancho de la imagen), a continuación, se desea nn.CrossEntropyLoss forma etiqueta (batch_size, h, w), para cada lote, los datos de la etiqueta de categoría representativa cada píxel pertenece, si es una clasificación binaria, el valor de la etiqueta solamente 0 o 1, si los tres clasificación, el valor de la etiqueta puede ser 0, 1, y así sucesivamente.
entropía Cross es una medida de la similitud entre las dos distribuciones, y por lo tanto la red neuronal puede estimar la proximidad de la salida real y la salida deseada. Supongamos que hay dos distribucionesp ( x ) ,Q ( X ) , la entropía cruzada de los dos C E H=-x ∈ chiΣp ( x ) l o g ( q ( x ) )
Después de la clasificación, una etiqueta dada y la muestra, la muestra sólo puede pertenecer a una especie, suponiendo que la muestra pertenece a la especiek , entoncesp ( x=k )=1 ,p ( x=k )=0 , por lo que la salida de la entropía cruzada de la muestra y la etiqueta se puede simplificar a C E H=- l o g ( q ( x=k ) )
salida de la red neural es generalmente igual al número de vectores de categorías, a fin de convertir la distribución de probabilidad vector, es decir,q ( x=K ) en la forma debe ser utilizado convertidos de función Softmax la salida de la red neural, pero la forma de la función de entropía cruzada añadió función softmax es el siguiente, la fórmula es la fórmula nn.CrossEntropyLoss l o s s ( x ,k )=- l o g(Σje x p ( x [ j ] )e x p ( x [ k ] ))
import torch
import numpy as np
import torch.nn as nn
import math
a = torch.randn((4,3,8,8))
b = np.random.randint(0,3,(4,8,8))
b = torch.from_numpy(b)
loss_fn = nn.CrossEntropyLoss()
b = b.long()
loss = loss_fn(a, b)
loss
# tensor(1.3822)#验证softmax2d就是对每一个N维度沿着C维度做softmax
m = nn.Softmax2d()
output = m(a)#验证softmax2d就是对每一个N维度沿着C维度做softmax
a01 = math.exp(a[0,0,0,0])
a02 = math.exp(a[0,1,0,0])
aa = a01 + a02
print(a01/aa)print(a02/aa)print(output[0,0,0,0])print(output[0,1,0,0])
loss =0for batch inrange(4):for i inrange(8):for j inrange(8):if b[batch, i, j]==1:
loss = loss - math.log(output[batch,1, i, j])if b[batch, i, j]==0:
loss = loss - math.log(output[batch,0, i, j])if b[batch, i, j]==2:
loss = loss - math.log(output[batch,2, i, j])print(loss/64/4)#将总的loss对总样本数取平均值,样本数为图像中像素数量8*8再*batch_size即为8*8*4# 1.3822217100148755
Los resultados se pueden ver, el cálculo manual de la pérdida igual a la loss_fn pérdida calculada