RuntimeWarning:numpy.dtype大小已更改,可能表示二进制不兼容

Blu*_*482 137 python numpy scikit-learn

我尝试加载已保存的SVM模型时出现此错误.我尝试卸载sklearn,NumPy和SciPy,再次重新安装最新版本(使用pip).我仍然收到此错误.为什么?

In [1]: import sklearn; print sklearn.__version__
0.18.1
In [3]: import numpy; print numpy.__version__
1.11.2
In [5]: import scipy; print scipy.__version__
0.18.1
In [7]: import pandas; print pandas.__version__
0.19.1

In [10]: clf = joblib.load('model/trained_model.pkl')
---------------------------------------------------------------------------
RuntimeWarning                            Traceback (most recent call last)
<ipython-input-10-5e5db1331757> in <module>()
----> 1 clf = joblib.load('sentiment_classification/model/trained_model.pkl')

/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in load(filename, mmap_mode)
    573                     return load_compatibility(fobj)
    574
--> 575                 obj = _unpickle(fobj, filename, mmap_mode)
    576
    577     return obj

/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in _unpickle(fobj, filename, mmap_mode)
    505     obj = None
    506     try:
--> 507         obj = unpickler.load()
    508         if unpickler.compat_mode:
    509             warnings.warn("The file '%s' has been generated with a "

/usr/lib/python2.7/pickle.pyc in load(self)
    862             while 1:
    863                 key = read(1)
--> 864                 dispatch[key](self)
    865         except _Stop, stopinst:
    866             return stopinst.value

/usr/lib/python2.7/pickle.pyc in load_global(self)
   1094         module = self.readline()[:-1]
   1095         name = self.readline()[:-1]
-> 1096         klass = self.find_class(module, name)
   1097         self.append(klass)
   1098     dispatch[GLOBAL] = load_global

/usr/lib/python2.7/pickle.pyc in find_class(self, module, name)
   1128     def find_class(self, module, name):
   1129         # Subclasses may override this
-> 1130         __import__(module)
   1131         mod = sys.modules[module]
   1132         klass = getattr(mod, name)

/usr/local/lib/python2.7/dist-packages/sklearn/svm/__init__.py in <module>()
     11 # License: BSD 3 clause (C) INRIA 2010
     12
---> 13 from .classes import SVC, NuSVC, SVR, NuSVR, OneClassSVM, LinearSVC, \
     14         LinearSVR
     15 from .bounds import l1_min_c

/usr/local/lib/python2.7/dist-packages/sklearn/svm/classes.py in <module>()
      2 import numpy as np
      3
----> 4 from .base import _fit_liblinear, BaseSVC, BaseLibSVM
      5 from ..base import BaseEstimator, RegressorMixin
      6 from ..linear_model.base import LinearClassifierMixin, SparseCoefMixin, \

/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py in <module>()
      6 from abc import ABCMeta, abstractmethod
      7
----> 8 from . import libsvm, liblinear
      9 from . import libsvm_sparse
     10 from ..base import BaseEstimator, ClassifierMixin

__init__.pxd in init sklearn.svm.libsvm (sklearn/svm/libsvm.c:10207)()

RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 80
Run Code Online (Sandbox Code Playgroud)

更新:好的,按照这里,和

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn
Run Code Online (Sandbox Code Playgroud)

错误现在已经消失,但我仍然不知道为什么它首先出现...

iva*_*eev 139

根据MAINT:沉默Cython关于更改dtype/ufunc大小的警告.- numpy/numpy:

每当您导入针对较旧的numpy编译的scipy(或其他包)时,这些警告都是可见的.

并且检查由Cython插入(因此存在于使用它编译的任何模块中).

简而言之,这些警告在特定情况下应该是良性的numpy,并且这些消息自从numpy 1.8(此提交进入的分支)被过滤掉.虽然scikit-learn 0.18.1编译反对numpy 1.6.1.

要自己过滤这些警告,您可以像修补程序那样执行相同操作:

import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
Run Code Online (Sandbox Code Playgroud)

当然,你可以重新编译从源代码的所有受影响的模块对当地numpypip install --no-binary :all:¹ ,而不是如果你有该工具.


更长的故事:补丁的支持者声称应该没有专门的风险numpy,并且第三方软件包是故意针对旧版本构建的:

[重建当前numpy的一切]不是一个可行的解决方案,当然不应该是必要的.Scipy(许多其他软件包)与numpy的许多版本兼容.因此,当我们分发scipy二进制文件时,我们会根据支持最低的numpy版本(目前为1.5.1)构建它们,并且它们也适用于1.6.x,1.7.x和numpy master.

真正正确的是,当dtypes/ufuncs的大小以打破ABI的方式发生变化时,Cython只会发出警告,否则就会保持沉默.

因此,Cython的开发人员同意信任numpy团队手动维护二进制兼容性,因此我们可以预期使用具有破坏ABI更改的版本将产生特制的异常或其他一些明确的show-stopper.


¹ 以前提供的--no-use-wheel选项已被删除,因为pip 10.0.0.


Par*_*n.S 35

这是新numpy版本的问题(1.15.0)

你可以降级numpy,这个问题将得到解决:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

最后发布了numpy 1.15.1版本,因此修复了警告问题.

sudo pip install numpy == 1.15.1

这工作..

  • 错误地,在1.14.5和1.15.0之间删除了使警告静止的代码.[fix](https://github.com/numpy/numpy/pull/11634)是1.15.1修正版的一部分,应该在2018年8月底之前发布 (6认同)
  • 谢谢@mattip.`pip install numpy == 1.15.1`让我从1.15.0到1.15.1并且警告消息消失了. (3认同)

小智 8

我尝试过上述方法,但没有任何效果.但是我通过apt install安装库后,问题就消失了,

对于Python3,

pip3 uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python3-numpy python3-scipy python3-pandas python3-sklearn 
Run Code Online (Sandbox Code Playgroud)

对于Python2,

pip uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python-numpy python-scipy python-pandas python-sklearn 
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 你卸载了Py2版本并安装了Py3版本. (11认同)

小智 6

如果您在anaconda环境中,请使用:

conda update --all
Run Code Online (Sandbox Code Playgroud)

  • 或者只更新对我有用的 numpy:```conda update numpy``` (4认同)

小智 5

只需升级您的numpy模块,现在它是1.15.4。对于窗户

pip install numpy --upgrade
Run Code Online (Sandbox Code Playgroud)