我正在尝试实现softmax function,但奇怪的是,我在MATLAB和Python上得到了两种不同的输出:
matlab脚本:
function sm = softmax(Y)
e_y = exp(Y - max(Y))
sm = e_y / sum(e_y)
如果Y是501
的10x200
矩阵,则将0.1
作为列向量计算10次(正确地,因为每列的和是1
同时,此Python脚本:
import numpy as np
def softmax(y):
e_y = np.exp(y - np.max(y))
return e_y / e_y.sum()
y = np.full((10,200), fill_value=501)
print(softmax(y))
在相同的输入y
上计算,
[[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
...
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]]
这是错误的,因为每列的总和不是*1
,而是0.005
我遗漏了什么?
1条答案
按热度按时间cbwuti441#
您真正想要做的是计算元素除法,而不是矩阵除法:您需要将
/
运算符替换为./
-根据documentation-在您的MATLAB脚本中(错误地)计算单个列向量或0.1
,而不是0.1
的矩阵,正如Cris Luengo在他们的评论中所指出的那样。此外,在您的Python脚本中,您正在考虑完整矩阵
max
元素,同时您应该考虑表示单个预测的每一列,并将其标准化。即:您将正确地获得如下组成的
(10,200)
整形数组/矩阵:进一步演示:
您将获得: