相同的脚本在Matlab和Python上计算不同的结果

mrphzbgm  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(428)

我正在尝试实现softmax function,但奇怪的是,我在MATLAB和Python上得到了两种不同的输出:

matlab脚本:

function sm = softmax(Y)
    e_y = exp(Y - max(Y))
    sm = e_y / sum(e_y)

如果Y是50110x200矩阵,则将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
我遗漏了什么?

cbwuti44

cbwuti441#

您真正想要做的是计算元素除法,而不是矩阵除法:您需要将/运算符替换为./-根据documentation-在您的MATLAB脚本中(错误地)计算单个列向量或0.1,而不是0.1矩阵,正如Cris Luengo在他们的评论中所指出的那样。
此外,在您的Python脚本中,您正在考虑完整矩阵max元素,同时您应该考虑表示单个预测的每一列,并将其标准化。即:

def softmax(y):
    e_y = np.exp(y - np.max(y, axis=0))
    return e_y / np.sum(e_y, axis=0)  # axis = 0

您将正确地获得如下组成的(10,200)整形数组/矩阵:

array([[0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
       [0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
       [0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
       ...,
       [0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
       [0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
       [0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1]])

进一步演示:

# Allocate a (3,4) matrix composed of 0..11 elements
y = np.asmatrix(np.arange(12)).reshape(3,4)
print(softmax(y))

您将获得:

matrix([[3.29320439e-04, 3.29320439e-04, 3.29320439e-04, 3.29320439e-04],
        [1.79802867e-02, 1.79802867e-02, 1.79802867e-02, 1.79802867e-02],
        [9.81690393e-01, 9.81690393e-01, 9.81690393e-01, 9.81690393e-01]])

相关问题