背景
最近上实验需要实现iris数据集的分类工作,发现自己对softmax的dim参数和crossentropy的实现不太理解,写文章记录一下 。
环境
windows
python 3.9.7
torch 1.10.0
softmax函数
先来看下它的函数定义。
输入参数必须的是:输入张量input,计算的维度dim。
softmax计算公式:
\text{Softmax}(a_i) =\frac{e^{a_i}}{\sum_{c=1}^{n}e^{a_c}}\
\
其中,a_i是某个元素,n 是输出节点的个数。
我就是对这个dim有点搞不明白。
绿色的是进行计算的元素,
画了个图,这样就很直观的看到 到底传入的dim参数是在对哪些元素进行 softmax。
CrossEntropy损失函数
交叉熵函数,输入一个类的概率tensor和一个真实值。
预测值加起来=1,即使输入前预测值加起来=1,在torch中,还是会经过一个softmax再进行计算的。
一般的交叉熵的公式如下:
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。
普通的交叉熵计算如下:
但是与普通的交运算不同的是,torch中的交叉熵在进行普通的交叉熵运算前,还需要进行一次softmax回归,再进行交叉熵的计算。
这里 -1*log(0.2814)=1.2679781343018484
所以,这就是pytorch和普通的交叉熵不一样的地方:多了一层softmax。