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