1.SoftMax分类器
在Mnist数据集中,我们要得到的输出是0-9,共有十类,这种情况下我们希望输出0-9的概率都大于0,且和为1。
使用SoftMax分类器进行多分类问题(其输入不需要Relu激活,而是直接连接线性层),经过SoftMax分类器后满足:1.大于等于0,2.所有类别概率和为1.
2.Loss function - Cross Entropy 交叉熵
NLLLoss(nagative log likelihood loss ):右边输入 Y是真实标签,另一个输入要求是 softmax之后求对数
使用Numpy计算交叉熵损失的过程:(One-hot是一行或一列只有一位是1的矩阵)
使用Pytorch计算交叉熵损失:
在PyTorch中,交叉熵损失全部封装成了Torch.nn.CrossEntropyLoss() 上图的交叉熵损失就包含了softmax计算和右边的标签输入计算。
所以在使用交叉熵损失的时候,神经网络的最后一层是不要做激活的,因为激活(就是把它做成分布),是包含在交叉熵损失里面的,最后一层不要做非线性变换,直接交给交叉熵损失。
举例:
3个类别,分别是2,0,1
Y_pred1 ,Y_pred2还是线性输出,没经过softmax,还不是概率分布,比如Y_pred1,0.9最大,表示对应为第3个的概率最大,和2吻合,1.1最大,表示对应为第1个的概率最大,和0吻合,2.1最大,表示对应为第2个的概率最大,和1吻合,那么Y_pred1 的损失会比较小
对于Y_pred2,0.8最大,表示对应为第1个的概率最大,和0不吻合,0.5最大,表示对应为第3个的概率最大,和2不吻合,0.5最大,表示对应为第3个的概率最大,和2不吻合,那么Y_pred2 的损失会比较大
参考代码:
import torch
y = torch.LongTensor([2, 0, 1]) # 注意此处是LongTensor
# z_1和z_2是最后一层输出,进入Softmax之前的值,