Comprender el significado de Pytorch dentro nn.CrossEntropyLoss

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 distribuciones pag ( X ) , q ( X ) p (x), q (x) , la entropía cruzada de los dos
    C mi H = - Σ X χ p ( x ) l o g ( q ( x ) ) CEH = - \ sum_ {x \ in \ chi} p (x) log (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 especie k k , entonces p ( x = k ) = 1 , p ( x k ) = 0 p (x = k) = 1, p (x \ neq 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 ) ) CEH = -log (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 ) 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 ( e x p ( x [ k ] ) j e x p ( x [ j ] ) ) de pérdida (x, k) = - log \ left (\ dfrac {exp (x [k])} {\ sum_ {j} exp (x [j])} \ right)
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 = 0
for batch in range(4):
    for i in range(8):
        for j in range(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
Publicó un artículo original · ganado elogios 0 · Vistas 4079

Supongo que te gusta

Origin blog.csdn.net/lang_yubo/article/details/105108174
Recomendado
Clasificación