PyTorch----Softmax函数与交叉熵函数

二分类问题和多分类问题

  • 二分类问题:

    分类任务中有两个类别。比如前面感知机识别香蕉还是苹果,一般会训练一个分类器,输入一幅图像,输出该图像是苹果的概率为p,对p进行四舍五入,输出结果为0或者1,这就是经典的二分类问题。

  • 多分类问题:

    和二分类任务基本相似,最后的输出有多个标签(>=2),需要建立一个分类器可以识别多种水果。

  • 在二分类问题中,我们可以用max函数 ,因为只有两个标签,非黑即白。但是在多分类问题中,没办法判断,因为有多个标签。所以要使用Softmax函数。

Softmax函数

  • Softmax函数把输入映射为0~1之间的实数,并且通过归一化保证了这些数字总和为1,是一种激活函数

  • 这样多分类任务就可以求出概率。

  • Softmax层常常和交叉熵损失函数一起结合使用。

numpy写Softmax

import numpy as np

def softmax(x):
    return np.exp(x) / np.sum(np.exp(x))


x = np.array([2.0,1.0,0.1])

outputs = softmax(x)
print("输入:",x)
print("输出:",outputs)
print("输出之和:",outputs.sum())

可以看出2.0的权重最高,得到的值权重也最高,最终的和为1:
在这里插入图片描述

PyTorch封装的Softmax()函数

dim参数:

  1. dim为0时,对所有数据进行softmax计算
  2. dim为1时,对某一个维度的列进行softmax计算
  3. dim为-1 或者2 时,对某一个维度的行进行softmax计算
import torch
x = torch.tensor([2.0,1.0,0.1])
x.cuda()
outputs = torch.softmax(x,dim=0)
print("输入:",x)
print("输出:",outputs)
print("输出之和:",outputs.sum())

在这里插入图片描述


交叉熵函数

栗子引入:

  • 假设要预测葡萄酒的酒精浓度、苹果酸浓度和灰分浓度等特征来预测葡萄酒的源产地。假设输出的标签为英国、法国和美国.
  • 多分类任务使用Softmax函数将一个数值向量归一化为一个概率分布向量,且各个概率之和为1.
  1. 模型1:
序号 预测结果 预测标签 是否正确
1 0.3 ,0.3 ,0.4 0 0 1(美国) 正确
2 0.3,0.4, 0.3 0 1 0(法国) 正确
3 0.1,0.2,0.7 1 0 0 (英国) 错误
  • 可以看出序号1预测正确的时候,0.4只比0.3高了0.1,勉强预测正确
  • 序号3预测错误的时候相差0.6之高,完全错误
  1. 模型2(使用了交叉熵损失函数):
序号 预测结果 预测标签 是否正确
1 0.1 ,0.2 ,0.7 0 0 1(美国) 正确
2 0.1,0.7, 0.2 0 1 0(法国) 正确
3 0.4,0.3,0.3 1 0 0 (英国) 错误
  • 可以看出预测正确的时候相差高达0.6,完全正确

  • 预测错误时相差仅有0.1

  • 交叉熵函数是一种损失函数

  • 损失函数反映的是预测结果和实际结果之间的差距

  • 交叉熵函数分为二分类(torch.nn.BCELoss())和多分类函数(torch.nn.CrossEntropyLoss())

loss = BCELoss()
loss(预测值,真实值)

# 二分类 损失函数
loss = torch.nn.BCELoss()
l = loss(pred,real)
# 多分类损失函数
loss = torch.nn.CrossEntropyLoss()

你可能感兴趣的