定义
softmax
:将一个数值序列映射到概率空间(每个元素分布并且所有和为1)log_softmax
:在softmax的基础上取对数NLLLoss
:对log_softmax与one-hot进行计算CrossEntropy
:衡量两个概率分布的差别(交叉熵)
在分类问题中,CrossEntropy等价于log_softmax 结合 nll_loss。
激活函数
softmax
import torch
import torch.nn.functional as F
'''
torch.nn.functional 涉及了所有 torch.nn 需要 类 和 方法 ,torch.nn 构建的模块通常就是调用 torch.nn.functional 里的方法实现的.
'''
torch.manual_seed(0)
output = torch.randn(2, 3)
print(output)
#tensor([[ 1.5410, -0.2934, -2.1788],
# [ 0.5684, -1.0845, -1.3986]])
print(F.softmax(output, dim=1))
# 这里dim的意思是计算Softmax的维度,这里设置dim=1,可以看到每一行的加和为1。0是对列 1 是对行
#tensor([[0.8446, 0.1349, 0.0205],
# [0.7511, 0.1438, 0.1051]])
T-softmax
T-softmax的目的是平滑分布,不让分布太过于极端。比如可以看下面的实例哈。
import numpy as np
def softmax(x):
x_exp = np.exp(x)
return x_exp / np.sum(x_exp)
output = np.array([0.1, 1.6, 3.6])
print(softmax(output))
#[0.02590865 0.11611453 0.85797681]
使用带温度系数的softmax函数:
def softmax_t(x, t):
x_exp = np.exp(x / t)
return x_exp / np.sum(x_exp)
output = np.array([0.1, 1.6, 3.6])
print(softmax_t(output, 5))
#[0.22916797 0.3093444 0.46148762]
设置为5可以看到分布在【0,1】的数更加平滑了。
log_softmax
这个很好理解,其实就是对softmax
处理之后的结果执行一次对数运算。可以理解为 log(softmax(output))
print(F.log_softmax(output, dim=1))
print(torch.log(F.softmax(output, dim=1)))
# 输出结果是一致的
tensor([[-0.1689, -2.0033, -3.8886], [-0.2862, -1.9392, -2.2532]]) tensor([[-0.1689, -2.0033, -3.8886], [-0.2862, -1.9392, -2.2532]])
损失函数
NLLLoss
该函数的全称是negative log likelihood loss
. 若