从 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
我已经使用 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