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

时间:2016-11-28 13:17:49

标签: 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

更新:确定,按照here

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn

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

10 个答案:

答案 0 :(得分:132)

根据MAINT: silence Cython warnings about changes dtype/ufunc size. - numpy/numpy

  

每当您导入scipy(或其他人)时,这些警告都会显示   ()包是针对较旧的numpy而不是已安装的。

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

长话短说,这些警告在numpy 的特定情况下应该是良性的,这些消息会在numpy 1.8 后被过滤掉(这个提交进入的分支)。虽然scikit-learn 0.18.1 is compiled against numpy 1.6.1

要自行过滤这些警告,您可以执行相同的as the patch does

import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")

当然,如果您拥有,您可以使用numpy¹重新编译来自源的所有受影响的模块,而不是<{1}} s>球工具。

更长的故事:补丁的支持者claims应该没有专门针对pip install --no-binary :all:的风险,而第三方软件包是针对旧版本而构建的:

  

[重建当前numpy的一切]是不可行的   解决方案,当然不应该是必要的。 Scipy(和其他许多人一样)   packages)与numpy的许多版本兼容。所以,当我们   分发scipy二进制文件,我们在最低支持下构建它们   numpy版本(截至目前为1.5.1),它们适用于1.6.x,1.7.x和   numpy master也是。

     

真正正确的是Cython只会在发出警告时发出警告   dtypes / ufuncs的大小以破坏ABI的方式发生变化,并且是   否则就是沉默。

结果,Cython的开发人员agreed to trust the numpy team with maintaining binary compatibility by hand,所以我们可以预期使用具有破坏性ABI更改的版本会产生一个特制的异常或其他一些显式的show-stopper。

¹以前提供的numpy选项已被移除since pip 10.0.0

答案 1 :(得分:36)

这是新的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

这正在工作。

答案 2 :(得分: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 

对于Python2,

pip uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python-numpy python-scipy python-pandas python-sklearn 

希望有帮助。

答案 3 :(得分:5)

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

conda update --all

答案 4 :(得分:3)

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

pip install numpy --upgrade

答案 5 :(得分:1)

之所以发生此错误,是因为已安装的程序包是由numpy的另一个版本重新构建的。 我们需要针对本地numpy重建scipy和scikit-learn。

对于新的pip(在我的情况下为pip 18.0),此方法有效:

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy,scikit-learn -I scipy scikit-learn

--no-binary列出了您要忽略二进制文件的软件包名称。在这种情况下,我们传递了--no-binary scipy,scikit-learn,它将忽略软件包scipy,scikit-learn的二进制文件。 没帮助我

答案 6 :(得分:0)

元信息:The recommended way to install sklearn

  

如果您已经可以正常安装numpy和scipy,则   安装scikit-learn的最简单方法是使用pip

pip install -U scikit-learn 
     

conda

conda install scikit-learn

[...请勿使用pip从源代码编译]

  

如果您尚未使用numpy和scipy安装python,建议您通过软件包管理器或a python bundle安装。这些附带了numpy,scipy,scikit-learn,matplotlib和许多其他有用的科学和数据处理库。

答案 7 :(得分:0)

请注意,从cython 0.29开始,有一个新的check_size option从源头消除了警告,因此,一旦该版本渗入到各种软件包中,便不需要任何解决方法。

答案 8 :(得分:-2)

我的环境是Python 2.7.15

我尝试

pip uninstall
pip install --no-use-wheel

但不起作用。它显示错误:

  

没有这样的选择:--no-use-wheel

然后我尝试:

pip uninstall
pip install --user --install-option="--prefix=" -U scikit-learn

而且有效:不会显示无用的警告。

答案 9 :(得分:-4)

导入scipy时,错误信息显示:RuntimeWarning:内置 .type大小已更改,可能表示二进制不兼容。期待zd,得到了zd

我通过将python版本从2.7.2更新为2.7.13来解决了这个问题