【问题标题】:Softmax function of 2d array二维数组的softmax函数
【发布时间】:2023-04-08 18:13:01
【问题描述】:

大家好,我有以下形状 [5,3] 的矩阵,我想获得 softmax 函数。

array([[340.        ,  59.33333333, 348.11111111],
       [292.5       ,  46.5       , 297.875     ],
       [301.14285714,  48.28571429, 307.71428571],
       [307.        ,  50.        , 319.28571429],
       [307.77777778,  48.44444444, 313.44444444]])

上述矩阵的名称是 e_l1,我尝试了这段代码,得到了一个矩阵,但是当我尝试对每一行求和时,结果不是 1,这意味着我的结果是错误的。

e= np.exp(e_l1- np.max(e_l1))
S= np.sum(e,axis=0)
P= e/S

结果我得到了这个:

 [[1.00000000e+00 9.99874329e-01 1.00000000e+00]
 [2.34969834e-21 2.66992811e-06 1.52312011e-22]
 [1.33216272e-17 1.59230195e-05 2.85681188e-18]
 [4.65888615e-15 8.84158760e-05 3.02892988e-13]
 [1.01406710e-14 1.86621235e-05 8.79949929e-16]]

并且作为行总和的结果:

[2.99987433e+00 2.66992811e-06 1.59230195e-05 8.84158763e-05

1.86621235e-05]

有人知道这里发生了什么吗?我认为我使用的公式是正确的

【问题讨论】:

    标签: python numpy softmax


    【解决方案1】:

    您似乎只是为求和使用了错误的轴,因为您正在计算每一行的概率,您需要将该行中的每个元素除以同一行中所有元素的总和

    e = np.exp(e_l1- np.max(e_l1))
    S = np.sum(e,axis=1)
    P = e/np.expand_dims(S, 1)
    
    print(P.sum(axis=1))
    

    【讨论】:

    • 正如我在互联网上看到的那样,正确的是计算跨列元素的总和,不是吗?
    • 嗯,这取决于您的用例。但是,如果您正在处理机器学习问题,那么通常每一行代表您的数据样本,而列代表您的模型为每个类预测的 logits。你想要的是:为每个样本计算它属于 ne 类的概率。这就是为什么你为每一行独立地标准化每一行(因此sum(axis=1))。这样,您将获得每行的总和 == 1。如果这不是您的用例,那么您的问题不太清楚,请对其进行编辑以包含有关您的用例的更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多