二分类问题和多分类问题
- 二分类问题:
分类任务中有两个类别。比如前面感知机识别香蕉还是苹果,一般会训练一个分类器,输入一幅图像,输出该图像是苹果的概率为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参数:
- dim为0时,对所有数据进行softmax计算
- dim为1时,对某一个维度的列进行softmax计算
- 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 | 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之高,完全错误
- 模型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()