损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。
无论网络怎么定义,最终要做一件什么事,完全由损失函数决定的,损失函数决定了一个函数的走向
到PyTorch官方下载界面,提示建议使用Anaconda进行安装
所以选择以下几个安装包,若没有CUDA则还需安装CUDA
打开Windos的DOS窗口执行以下命令
conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge
查看PyTorch官方文档BCELLOS类,官方文档给出的损失函数是这样定义的
其中:
根据官方文档的公式可以手动写代码实现一遍,看是否与官方的结果相同
import torch
from torch import autograd
from torch import nn
import math
input = autograd.Variable(torch.tensor([[ 1.9072, 1.1079, 1.4906],
[-0.6584, -0.0512, 0.7608],
[-0.0614, 0.6583, 0.1095]]), requires_grad=True)
print(input)
tensor([[ 1.9072, 1.1079, 1.4906],
[-0.6584, -0.0512, 0.7608],
[-0.0614, 0.6583, 0.1095]], requires_grad=True)
m = nn.Sigmoid()
print(m(input))
tensor([[0.8707, 0.7517, 0.8162],
[0.3411, 0.4872, 0.6815],
[0.4847, 0.6589, 0.5273]], grad_fn=)
target = torch.FloatTensor([[0, 1, 1], [1, 1, 1], [0, 0, 0]])
print(target)
tensor([[0., 1., 1.],
[1., 1., 1.],
[0., 0., 0.]])
r11 = 0 * math.log(0.8707) + (1-0) * math.log((1 - 0.8707))
r12 = 1 * math.log(0.7517) + (1-1) * math.log((1 - 0.7517))
r13 = 1 * math.log(0.8162) + (1-1) * math.log((1 - 0.8162))
r21 = 1 * math.log(0.3411) + (1-1) * math.log((1 - 0.3411))
r22 = 1 * math.log(0.4872) + (1-1) * math.log((1 - 0.4872))
r23 = 1 * math.log(0.6815) + (1-1) * math.log((1 - 0.6815))
r31 = 0 * math.log(0.4847) + (1-0) * math.log((1 - 0.4847))
r32 = 0 * math.log(0.6589) + (1-0) * math.log((1 - 0.6589))
r33 = 0 * math.log(0.5273) + (1-0) * math.log((1 - 0.5273))
bceloss = -(r11 + r12 + r13 + r21 + r22 + r23 + r31 + r32 + r33)/9
print(bceloss)
0.8000147727101611
loss = nn.BCELoss()
print(loss(m(input), target))
tensor(0.8000, grad_fn=) 结果与上面手动计算的结果一致