从 scipy 导入 softmax 并从 sklearn 导入后使用它的问题

Problem with importing softmax from scipy and using it once imported from sklearn

我已经使用 conda 安装了 scipy。

当我尝试从 scipy 导入 softmax 时出现错误:

from scipy.special import softmax
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-34-35eed14e1f88> in <module>
----> 1 from scipy.special import softmax

ImportError: cannot import name 'softmax' from 'scipy.special' (C:\Users\Alienware\Anaconda3\envs\tf2\lib\site-packages\scipy\special\__init__.py)

另一方面,我可以从 sklearn 导入 softmax,但是当我尝试使用它时出现异常:

from sklearn.utils.extmath import softmax
X = np.array([[2, 3], [4,5]])
softmax(X)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-35-781ae2561cff> in <module>
      1 X = np.array([[2, 3], [4,5]])
----> 2 softmax(X)

~\Anaconda3\envs\tf2\lib\site-packages\sklearn\utils\extmath.py in softmax(X, copy)
    597     max_prob = np.max(X, axis=1).reshape((-1, 1))
    598     X -= max_prob
--> 599     np.exp(X, X)
    600     sum_prob = np.sum(X, axis=1).reshape((-1, 1))
    601     X /= sum_prob

TypeError: ufunc 'exp' output (typecode 'd') could not be coerced to provided output parameter (typecode 'l') according to the casting rule ''same_kind''

您问题的第一部分可能已由评论回答,归结为您使用的 SciPy 版本只是不包含 softmax 的版本。对于第二部分,错误消息表明它无法将 double 转换为 long;您可以通过在输入中仅使用双打来解决这个问题:

In [13]: softmax(X.astype(np.double))                                                                    
Out[13]: 
array([[0.26894142, 0.73105858],
       [0.26894142, 0.73105858]])

softmax 不适用于整数,这在 the documentation and is by design:

中也很明显

Parameters

X : array-like of floats, shape (M, N) Argument to the logistic function

我通过将 scikit-learn 和 scipy 升级到最新版本解决了这个问题:

pip install --upgrade scikit-learn scipy