损失函数

import torch
from torch import nn
import torch.nn.functional as F

a = torch.tensor([[1,2,3],[4,5,6]])
torch.sum(a)     #tensor(21)
per_col_sum = torch.sum(a, dim=0)    #tensor([5, 7, 9]) 列堆叠
print("per_col_sum=",per_col_sum)
per_row_sum = torch.sum(a, dim=1)    #tensor([ 6, 15])  行堆叠
print("per_row_sum=",per_row_sum)
print(per_row_sum.reshape(-1,1))

 

1、L1Loss-绝对值误差

loss(x,yi) = |  x-   y |

input_data = torch.Tensor([[4], [5], [6]]) #torch.Tensor---'torch.FloatTensor'  # torch.tensor---torch.LongTensor
true_data = torch.Tensor([[3], [6], [8]])
print("input_data=", input_data)
print("true_data=", true_data)

L1Loss_function_default = nn.L1Loss()
loss_default = L1Loss_function_default(input_data, true_data)

L1Loss_function_none = nn.L1Loss(reduction="none")
loss_none = L1Loss_function_none(input_data, true_data)

L1Loss_function_sum = nn.L1Loss(reduction="sum")
loss_sum = L1Loss_function_sum(input_data, true_data)

L1Loss_function_elementwise_mean = nn.L1Loss(reduction="elementwise_mean")
loss_elementwise_mean = L1Loss_function_elementwise_mean(input_data, true_data)
print("---------------------------------L1 loss------------------------------")
print("loss_default=", loss_default)
print("loss_none", loss_none)
print("loss_sum=",loss_sum)
print("loss_elementwise_mean=", loss_elementwise_mean)
#验证---|y-f(x)|
print((abs(4-3)+abs(5-6)+abs(6-8))/3)

 

2、MSELoss(L2Loss)-均方误差

loss(xi,yi)=(xi−yi)2

MSELoss_function = nn.MSELoss()
loss = MSELoss_function(input_data, true_data)
print("---------------L2 loss-------------------")
print(loss)
#验证---|y-f(x)|**2
print(((4-3)**2 + (5-6)**2 + (6-8)**2)/3)

 

3、smooth-L1 loss

# SmoothL1Loss-|y-f(x)|<=1, 0.5*(y-f(x))**2/Beta  otherwise-|y-f(x)|-0.5*Beta ,Beta=1
print("---------------- SmoothL1Loss-------------")
smoothL1Loss_function = nn.SmoothL1Loss()
loss = smoothL1Loss_function(input_data, true_data)
print(loss)
#验证
print( (0.5*(4-3)**2 + 0.5*(5-6)**2 + abs(6-8)-0.5)/3 )

 

4、NLLLoss


print("-----------------NLLLoss--------------------------")#负对数似然损失
input_data = torch.Tensor([[1, 2, 3], [4, 5, 6], [2, 4, 6]])
logsoftmax = F.log_softmax(input_data, dim=1)
print("logsoftmax=",logsoftmax)

label = torch.LongTensor([0,2,1])
nll_loss_function = nn.NLLLoss()
loss = nll_loss_function(logsoftmax, label) #-1/N (sum(y * logsoftmax(x)))
print(loss)


##验证
one_hot = F.one_hot(label).float()
print("one_hot=",one_hot)
print(input_data)
print(torch.exp(input_data))
print(torch.sum(torch.exp(input_data), dim=1))
print(torch.sum(torch.exp(input_data), dim=1).reshape(-1,1))
sm = torch.exp(input_data)/torch.sum(torch.exp(input_data), dim=1).reshape(-1,1) #每行之和为1

logsm = torch.log(sm)
print("logsm=",logsm)
print("one_hot*logsm=", one_hot*logsm)
nll_loss = -torch.sum(one_hot*logsm)/label.shape[0]
print(nll_loss)


sm = nn.Softmax(dim=1) #每行之和为1
temp = torch.log(sm(input_data))
#print(temp)
print(-(temp[0][0]+temp[1][2]+temp[2][1])/3)
 

 

5、交叉熵

单个样本的交叉熵损失函数  L(y, y*) = - [ y * log(y*) + (1-y) * log(1-y*) ]  -----y:真值, y*:预测值

print("-------------------- CrossEntropyLoss-------------------------")
cross_entropy_loss_function = nn.CrossEntropyLoss()
loss = cross_entropy_loss_function(input_data, label)
print(loss)

 

6、BCELoss 

#BCELoss,要求样本必须在0~1之间,也就是需要调用sigmoid
print("---------------------BCELoss-----------------------------------")
bce_loss_function = nn.BCELoss()
sig = nn.Sigmoid()
input_sigmoid = sig(input_data)
print("input_sigmoid=",input_sigmoid)
bce_loss = bce_loss_function(input_sigmoid, one_hot)
print("bce_loss=",bce_loss)

#验证  one_hot= tensor([[1., 0., 0.],[0., 0., 1.],[0., 1., 0.]])
#input_sigmoid= tensor([[0.7311, 0.8808, 0.9526],[0.9820, 0.9933, 0.9975],[0.8808, 0.9820, 0.9975]])
import math
a00 = -1.0 * (1 * math.log(0.7311) + (1-1) * math.log(1-0.7311))
a01 = -1.0 * (0 * math.log(0.8808) +(1-0) * math.log(1-0.8808))
a02 = -1.0 * (0 * math.log(0.9526) + (1-0) * math.log(1-0.9526))
b1 = (a00+a01+a02)/3

a10 = -1.0 * (math.log(1-0.9820))
a11 = -1.0 * (math.log(1-0.9933))
a12 = -1.0 * (math.log(0.9975))
b2 = (a10+a11+a12)/3

a20 = -1.0 * (math.log(1-0.8808))
a21 = -1.0 * (math.log(0.9820))
a22 = -1.0 * (math.log(1-0.9975))
b3 = (a20+a21+a22)/3

out = (b1+b2+b3)/3
print("out=", out)

 

7、BCEWithLogitsLoss

print("--------------BCEWithLogitsLoss---------BCELoss和sigmoid融合---")
bce_logistic_loss = nn.BCEWithLogitsLoss()
loss_bce_logistic = bce_logistic_loss(input_data,one_hot)
print("loss_bce_logistic=",loss_bce_logistic)

 

posted @ 2021-04-08 15:49  crazybird123  阅读(132)  评论(0编辑  收藏  举报