按行计算 numpy 数组的 Softmax 函数

Pra*_*yal 5 python arrays numpy neural-network softmax

我正在尝试将 softmax 函数应用于 numpy 数组。但我没有得到想要的结果。这是我试过的代码:

 import numpy as np
 x = np.array([[1001,1002],[3,4]])
 softmax = np.exp(x - np.max(x))/(np.sum(np.exp(x - np.max(x)))
 print softmax
Run Code Online (Sandbox Code Playgroud)

我认为x - np.max(x)代码没有减去每一行的最大值。需要从 x 中减去最大值以防止非常大的数字。

这应该输出

 np.array([
    [0.26894142, 0.73105858],
    [0.26894142, 0.73105858]])
Run Code Online (Sandbox Code Playgroud)

但我得到:

np.array([
    [0.26894142, 0.73105858],
    [0, 0]])
Run Code Online (Sandbox Code Playgroud)

Pau*_*zer 6

保持由消耗的轴的一种简便方法“降低”,如操作maxsumkeepdims关键字:

mx = np.max(x, axis=-1, keepdims=True)
mx
# array([[1002],
#        [   4]])
x - mx
# array([[-1,  0],
#        [-1,  0]])
numerator = np.exp(x - mx)
denominator = np.sum(numerator, axis=-1, keepdims=True)
denominator
# array([[ 1.36787944],
#        [ 1.36787944]])
numerator/denominator
# array([[ 0.26894142,  0.73105858],
         [ 0.26894142,  0.73105858]])
Run Code Online (Sandbox Code Playgroud)


Pra*_*yal 1

x - np.max(x)代码没有进行逐行减法。让我们逐步进行。首先,我们将通过平铺或复制列来创建“maxes”数组:

maxes = np.tile(np.max(x,1), (2,1)).T
Run Code Online (Sandbox Code Playgroud)

这将创建一个 2X2 矩阵,该矩阵将通过创建重复的列(平铺)来对应于每行的最大值。之后您可以执行以下操作:

 x = np.exp(x - maxes)/(np.sum(np.exp(x - maxes), axis = 1))
Run Code Online (Sandbox Code Playgroud)

你应该得到你的结果。这axis = 1是您在答案标题中提到的按行softmax。希望这可以帮助。