pytorch基础知识-Cross Entropy(下)

2019-11-17 21:46:35 浏览数 (1)

上节课介绍了Cross Entropy 与 Enropy的区别,本节介绍Cross Entropy到底在二分类问题中是如何运算的。

假设面对的是猫狗的二分类问题,此时的Cross Entropy的表示公式为:

为更好的理解,我们以5分类问题进行解释

实际值为小猫。

当模型预测效果较好时

这里注意到使用Cross Entropy实现了0.9→0.02的过程。但采用MSE法,只能下降0.3左右。因此在分类问题上,采用Cross Entropy具有更快的运算速度。

另外目前主流上也不将MSE用于分类问题上,原因在于:

(1) Sigmoid MSE的方法有时会造成梯度离散的现象,且会增加training的难度。

(2) 采用Cross Entropy进行分类的速度会更快。

(3) 但也要学会变通,对于前沿问题上,若采用Cross Entropy法收敛效果不佳,可以使用MSE尝试一下。因为MSE法更为简单,且新算法刚出现时,使用时通常会伴随各种问题,采用MSE法的效果常常会更好。

至此我们以基本上了解了一个神经网络所具备的全部结构,那么在这里以简图绘制

输入值先变线型模型再经logit和softmax,通过CrossEntorpy计算输出label。

以代码具体示例

代码语言:javascript复制
import torch
import torch.nn.functional as F

x = torch.randn(1, 784)
w = torch.randn(10, 784)

logits = x@w.t()
# 将w与x相乘,变为x*w b模型
pred = F.softmax(logits, dim=1)
pred_log = torch.log(pred)
# 这里为了示例,设置了pred的log值作为对照
# 下面进行softmax
a = F.cross_entropy(logits, torch.tensor([3]))
# 这里要格外注意,cross_entropy函数默认包含了softmax功能,因此后面要传入的是logits,
# 此时若传入pred,再运行上段代码时会额外进行一次softmax
print('a:', a)

# 这里若想自己手动完成,则要改写代码为.bll_loss函数
b = F.nll_loss(pred_log, torch.tensor([3]))
print('b:', b)

分别输出为

代码语言:javascript复制
a: tensor(70.4491)
b: tensor(70.4491)

两者的结果一致

总结为:若使用Cross Entropy,则会默认使用了softmax log nll_loss三个函数功能。

0 人点赞