pytorch学习笔记(五)
一、softmax函数
import torch
x = torch.rand(3,requires_grad=True)
d = torch.nn.functional.softmax(x,dim=0) # dim的参数表示在哪个维度上进行softmax
grad = torch.autograd.grad(d[0],x,retain_graph=True) # 第一个参数是y,第二个是x
print(grad)
grad1 = torch.autograd.grad(d[1],x,retain_graph=True) # 第一个参数是y,第二个是x
print(grad1)
grad2 = torch.autograd.grad(d[0],x,retain_graph=True) # 第一个参数是y,第二个是x
print(grad2)
运行结果:
(tensor([ 0.2396, -0.0883, -0.1514]),)
(tensor([-0.0883, 0.1725, -0.0843]),)
(tensor([ 0.2396, -0.0883, -0.1514]),)
二、交叉熵介绍
交叉熵:刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。简言之就是判定实际输出与期望输出的接近程度。
三、交叉熵计算
pytorch提供了两个类进行交叉熵的计算,即CrossEntroyLoss()和Nllloss()。
pytorch中CrossEntropyLoss()函数的主要是结合了nn.LogSoftmax()和nn.NLLLoss()两个函数。
1、Softmax后的数值都在0~1之间,所以ln之后值域是负无穷到0。
2、然后将Softmax之后的结果取log,将乘法改成加法减少计算量,同时保障函数的单调性 。
3、NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来。
import torch
import torch.nn as nn
# LogSoftmax
x = torch.randn(2,2) # 生成一个随机输入
print("x",x)
# 计算输入softmax,每行结果相加等于1
soft = nn.Softmax(dim=1)
s_out = soft(x)
print("s_out",s_out)
# 在softmax基础上取log,减少计算量
log = torch.log(s_out)
print("log",log)
# 直接用LogSoftmaxloss计算,与先计算softmax,再在softmax基础上取log,结果进行比较,结果一致
logsoftmax = nn.LogSoftmax(dim=1)
l_out = logsoftmax(x)
print("l_out",l_out)
# NLLLoss()默认参数配置为:reducetion=True、size_average=True
y = torch.tensor([2,2,0])
nl = nn.NLLLoss()
nl_out = nl(l_out,y)
print("nl_out",nl_out)
# 使用CrossEntropyLoss()函数与用NLLLoss()计算的值进行比较
crossEntro = nn.CrossEntropyLoss()
c_out = crossEntro(x,y)
print("cout",c_out)
结果
x tensor([[ 0.8318, 0.2889, -0.9362],
[-0.5324, 0.5073, 0.4972],
[ 0.4779, 0.8779, 0.9592]])
s_out tensor([[0.5709, 0.3317, 0.0974],
[0.1509, 0.4267, 0.4224],
[0.2433, 0.3630, 0.3937]])
log tensor([[-0.5606, -1.1035, -2.3286],
[-1.8913, -0.8517, -0.8618],
[-1.4134, -1.0134, -0.9321]])
l_out tensor([[-0.5606, -1.1035, -2.3286],
[-1.8913, -0.8517, -0.8618],
[-1.4134, -1.0134, -0.9321]])
nl_out tensor(1.5346)
c_out tensor(1.5346)