【问题标题】:RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibilityRuntimeWarning:numpy.dtype 大小已更改,可能表示二进制不兼容
【发布时间】:2018-12-31 10:43:39
【问题描述】:

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

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

【问题讨论】:

  • --no-use-wheel 根据您系统上的任何内容从源代码重新编译模块。
  • 在较新版本的 pip 中,此命令已重命名为 --no-binary
  • 是的,这对我有用:pip install --no-binary :all: pandas。 FWIW 我在 Python 版本 Python 3.6.6 :: Anaconda, Inc. 之上的新 VE 版本中遇到了这个错误,环境中只安装了 requestspandas
  • 现在应该在 cython 0.29 中修复,如评论 below
  • 还需要安装gfortran scipy才能编译:sudo apt install gfortran

标签: python numpy scikit-learn


【解决方案1】:

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

每当您导入 scipy(或其他 package) 是针对比已安装旧的 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")

当然,如果你有 球 工具。


更长的故事:补丁的支持者claims 应该没有特别针对numpy 的风险,并且故意针对旧版本构建第 3 方包:

[根据当前的 numpy 重建所有内容] 不可行 解决方案,当然没有必要。 Scipy(和其他许多 包)与许多版本的 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 更改的版本会产生特制异常或其他一些显式的显示停止器。


¹以前可用的--no-use-wheel 选项已被删除since pip 10.0.0

【讨论】:

【解决方案2】:

import scipy时,错误信息显示:RuntimeWarning: builtin.type size changed,可能表示二进制不兼容。预期 zd,得到 zd

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

【讨论】:

    【解决方案3】:

    我已经尝试了上述方法,但没有任何效果。但是在我通过 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 
    

    希望对您有所帮助。

    【讨论】:

    • 您卸载了 Py2 版本并安装了 Py3 版本。
    • 似乎安装 python3 版本也解决了我的问题。
    • 如果您从官方发行版的存储库而不是从 PyPI 安装二进制包,包括 numpy,当然它们都是针对同一个 numpy 编译的。缺点是您可能无法获得最新版本。
    【解决方案4】:

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

    conda update --all
    

    或:

    conda update numpy
    

    【讨论】:

    • 或者只更新对我有用的 numpy:conda update numpy
    【解决方案5】:

    我的环境是 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
    

    而且它有效:没有显示无用的警告。

    【讨论】:

    • 选项--no-use-wheel 已被删除。请改用--no-binary :all:
    【解决方案6】:

    出现此错误是因为安装的软件包是针对不同版本的 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 的二进制文件。 没有帮助我

    【讨论】:

      【解决方案7】:

      这是新的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 是 1.15.1 错误修复版本的一部分,应该在 2018 年 8 月结束之前发布
      • 谢谢@mattip。 pip install numpy==1.15.1 让我从 1.15.0 升级到 1.15.1,警告消息消失了。
      • 使用 numpy 1.15.0,我在导入 PyTables 版本 3.4.4 和 H5Py 版本 2.8.0 时收到上述报告警告消息。安装 Numpy 1.15.1 版后警告消失。
      • 这仅在可以降级时才有效,但并非总是如此。随着 NumPy 的进步,这个解决方案变得越来越过时。
      【解决方案8】:

      元信息: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,我们建议通过您的包管理器或通过apythonbundle 安装。它们带有 numpy、scipy、scikit-learn、matplotlib 和许多其他有用的科学和数据处理库。

      【讨论】:

        【解决方案9】:

        请注意,从 cython 0.29 开始,有一个新的 check_size option 可以消除源头的警告,因此一旦该版本渗透到各种包中,就不需要任何变通方法

        【讨论】:

          【解决方案10】:

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

          pip install numpy --upgrade
          

          【讨论】:

          • 这对我有帮助
          猜你喜欢
          • 2021-05-04
          • 1970-01-01
          • 2021-12-12
          • 2014-11-03
          • 2020-06-04
          • 2021-07-06
          • 2021-10-30
          • 2021-05-09
          相关资源
          最近更新 更多