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中计算的交叉熵并不是采用上述公式,而是采用下面这种方式:

在这里插入图片描述

三、交叉熵计算

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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值