Softmax不会在Python实现中导致概率分布

时间:2019-02-14 19:19:35

标签: python python-3.x machine-learning deep-learning softmax

我有一个简单的softmax实现:

softmax = np.exp(x) / np.sum(np.exp(x), axis=0)

对于此处设置为数组的x:https://justpaste.it/6wis7

您可以将其加载为:

 import numpy as np

 x = np.as (just copy and paste the content (starting from array))

我得到:

softmax.mean(axis=0).shape 
(100,) # now all elements must be 1.0 here, since its a probability

softmax.mean(axis=0) # all elements are not 1

array([0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158])

为什么这个实现是错误的?如何解决?

2 个答案:

答案 0 :(得分:1)

对我很好:

import numpy as np

def softmax(x):
    return np.exp(x) / np.sum(np.exp(x), axis=0)

logits = softmax(np.random.rand(4))

print(logits)

softmax规范的所有元素之和应该等于1。

对于分类任务,通常使用具有最高值(np.argmax())或n个索引最高的索引,然后将其选择为最可能的类别:

class_index = np.argmax(logits)  # Assuming logits is the output of a trained model

print('Most likely class: %d' % class_index)

如JosepJoestar在评论中指出的,可以在here中找到softmax函数的定义。

答案 1 :(得分:1)

这些概率的总和必须为1,不是故意的。让我们通过这个简单的例子使它更加清楚。想象3个softmax输出值s = [0.5, 0.25, 0.25]。显然,他们必须总结1(概率)。但是他们的意思是0.333

>>> softmax.sum(axis=0)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

我希望这个例子能说明这一点!