pytorch中softmax和crossentropy的机制

186 阅读1分钟

背景环境softmax函数CrossEntropy损失函数

背景

最近上实验需要实现iris数据集的分类工作,发现自己对softmax的dim参数和crossentropy的实现不太理解,写文章记录一下 。

环境

windows

python 3.9.7

torch 1.10.0

softmax函数

先来看下它的函数定义。image-20220319123537705

输入参数必须的是:输入张量input,计算的维度dim。

softmax计算公式:

\text{Softmax}(a_i) =\frac{e^{a_i}}{\sum_{c=1}^{n}e^{a_c}}\

\

其中,a_i是某个元素,n 是输出节点的个数。

我就是对这个dim有点搞不明白。

image-20220319123749105

绿色的是进行计算的元素,

画了个图,这样就很直观的看到 到底传入的dim参数是在对哪些元素进行 softmax。

CrossEntropy损失函数

交叉熵函数,输入一个类的概率tensor和一个真实值。

image-20220319155911304

预测值加起来=1,即使输入前预测值加起来=1,在torch中,还是会经过一个softmax再进行计算的。

image-20220319160212288

一般的交叉熵的公式如下:

L = - \sum_{i=1}^{n}y_i·log(S(f_\theta(x_i))\

\

其中y_i是独热编码的,值为0或者1。f_\theta(x_i)是模型的输出,S(f_\theta(x_i))是将输出结果进行一次softmax。

普通的交叉熵计算如下:

image-20220319160859532

但是与普通的交运算不同的是,torch中的交叉熵在进行普通的交叉熵运算前,还需要进行一次softmax回归,再进行交叉熵的计算。

image-20220319161054693

这里 -1*log(0.2814)=1.2679781343018484

image-20220319161633102

所以,这就是pytorch和普通的交叉熵不一样的地方:多了一层softmax。