Dtype 大小改变,可能表示二进制不兼容

我在试图加载已保存的 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

更新: OK,通过遵循 给你,并且

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

这个错误现在已经消失了,尽管我仍然不知道为什么它会首先发生..。

120556 次浏览

根据 MAINT: static Cython 关于更改 dtype/ufunc size 的警告.-numpy/numpy:

这些警告在您导入 spypy (或其他 包) ,该包是根据比安装时间更长的 numpy 编译的。

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

长话短说,numpy的特殊情况下,这些警告应该是良性的这些消息从 numpy 1.8开始就被过滤掉了(这个提交所涉及的分支)。

要自己过滤这些警告 ,可以执行相同的 就像贴片一样:

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

当然,如果你有 蛋蛋工具的话,您可以根据本地 numpy从源代码重新编译所有受影响的模块pip install --no-binary :all:1就是 取而代之


更长的故事: 补丁的支持者 声称应该没有风险,特别是与 numpy,第三方软件包是有意针对旧版本:

[针对当前的麻木状态重建一切]是不可行的 解决方案,当然不应该是必要的 )兼容多个版本的 numpy。因此,当我们 分发 scypy 二进制文件,我们根据最低支持的 Numpy 版本(到目前为止是1.5.1) ,它们可以使用1.6.x、1.7. x 和 还有麻木的主人。

对于 Cython 来说,真正正确的做法是只在 Dtype/ufuns 的大小在某种程度上发生了变化,这种变化打破了 ABI 沉默,否则。

因此,Cython 的 devs 同意由手工维护二进制兼容性来信任麻木的团队,所以我们可以预期,使用具有破坏 ABI 更改的版本将产生一个特别精心制作的异常或一些其他显式的 show-stop。


1先前可用的 ABC0选项已从 pip 10.0.0 删除 < a href = “ https://github.com/pypa/pip/commit/95b9541ed4b73632a53c2bc192144bb9e9af1c6b”rel = “ noReferrer”> 。

当导入 spypy 时,错误信息显示: RuntimePolice: 天生的.type size 改变,可能表示二进制不兼容

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

我试过上面提到的方法,但没有一个奏效。但是在我通过 apt install 安装了这些库之后,这个问题就消失了,

对于 Python 3,

pip3 uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python3-numpy python3-scipy python3-pandas python3-sklearn

对于 Python 2,

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

希望能帮上忙。

如果你处在水蟒的环境中,简单地使用:

conda update --all

或:

conda update numpy

我的环境是 Python2.7.15

我尽力了

pip uninstall
pip install --no-use-wheel

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

没有这样的选择: ——无用的轮子

然后我试着:

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

它的工作: 无用的警告不显示。

发生此错误是因为安装的包是重新生成不同版本的 numpy。
我们需要重建学科和科学学习对本地 numpy

对于新的 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,它将忽略包 scypy,scikit-learn 的二进制文件。 帮不了我

这是一个新的 numpy 版本(1.15.0)

你可以降低 numpy 的等级,这个问题就解决了:

Sudo pip 卸载 numpy
Sudo pip install numpy = = 1.14.5

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

Sudo pip install numpy = = 1.15.1

这是工作. 。

元信息: 安装 sklearn 的推荐方法

如果您已经安装了 numpy 和 scypy,则 安装 scikit-learn 最简单的方法是使用 pip

pip install -U scikit-learn

conda:

conda install scikit-learn

[ ... 不要使用 pip 从源代码编译]

如果您还没有使用 numpy 和 scypy 安装 python,我们建议您通过您的软件包管理器或者通过 <一 href="https://www.enthought.com/products/c一nopy" rel="nofollow noreferrer">一 巨蟒 捆绑安装。这些数据库包括 numpy、 scipy、 scikit-learn、 matplotlib 和许多其他有用的科学和数据处理库。

注意,从 cython 0.29开始,有了一个新的 Check _ size 选项,它消除了源代码中的警告,因此一旦该版本渗透到各种包中,就不需要任何变通方法了

只要升级你的 numpy 模块,现在它是1.15.4

pip install numpy --upgrade