今天无意间看到了logistic回归的pytorch的实现,抱着他山之石可以攻玉的态度,阅读了一下代码,突然发现在其代码中的网络搭建部分只有一个Linear层,却不见softmax层(使用的是mnist数据集进行识别的所以要用到softmax回归),但是遍观其全体代码依然没有痕迹,这是我便奇了怪了,由于之在纯python和tf框架上敲过这个代码,所以对这一情况感觉很是奇怪,难道只用一个linear就能实现回归吗?在百四不得其解的情况下,我打印输出了一下label和他的输出值(预测)out发现label是单独的一个数(0~9)而out是一个向量(十维)然后我就看到他们被放到了损失函数nn.CrossEntropyLoss()里面,难道这里有什么玄机,我记得(tf的经验) 这个交叉熵损失函数的pre与y应该维度相同才对啊,程序这样输入进去不会报错吗?带着这个疑惑我去网上查找了一下关于nn.CrossEntropyLoss() 这个损失函数的定义,我发现其数学定义如下:
下面是我在网上找的一篇有关pytorch损失函数的博文,里面讲述了其数学定义及用法:
https://blog.csdn.net/zhangxb35/article/details/72464152?utm_source=itdadao&utm_medium=referral
同时,我又对tensorflow里面的损失函数产生了兴趣我于是有查阅了一下tensorflow里面如何使用softmax和交叉熵,我先找到了其softmax的定义:
嗯,是我们所熟知的softmax,接着我们看看tf如何使用他:
我们发现这里要使用y去乘log(pre)但是为什么在pytorch的一体化损失函数里面没有呢?
上图引自(
)我们可以看到,经过此举,其两种框架的写法也变得一致了,所以数学不好,地动山摇!!!
所以,我们由此可以看出,任凭框架一变再变,只要数学在手,你就可以任凭风浪起,稳坐钓鱼台了。