RuntimeWarning:numpy.dtypeのサイズが変更されました。バイナリの非互換性を示している可能性があります


148

保存された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

エラーが発生しましたが、なぜ最初にそれが発生したのかはまだわかりません...


3
--no-use-wheelシステムにあるものに対してソースからモジュールを再コンパイルします。
ivan_pozdeev

17
新しいバージョンのpipでは、このコマンドの名前がに変更されました--no-binary
s_kirkiles

1
うん、これは私のために働いた:pip install --no-binary :all: pandas。FWIW私は新鮮で、このエラーを得ていたPythonのバージョンの上にビルドをVE Python 3.6.6 :: Anaconda, Inc.のみとrequestsし、pandas環境に設置。
サファイ


また、インストールする必要がgfortranコンパイルするscipyのダウンロードのために:sudo apt install gfortran
ma3oun

回答:


145

MAINTによると、dtype / ufuncサイズの変更に関するCython警告が表示されなくなります。-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")

もちろん、あなたは自分の地元に対するソースからの影響を受けるすべてのモジュールを再コンパイルすることができnumpypip install --no-binary :all:¹ 代わりにあなたが持っている場合は、ボールをそのためのツールを。


より長い話:パッチの支持者特ににはリスクはないはずnumpyであり、サードパーティのパッケージは古いバージョンに対して意図的に構築されています:

[現在のnumpyに対してすべてを再構築することは]実行可能な解決策ではなく、確かに必要ではありません。Scipy(他の多くのパッケージと同様)は、numpyの多くのバージョンと互換性があります。したがって、scipyバイナリを配布するときは、サポートされている最も低いnumpyバージョン(現時点では1.5.1)に対してビルドし、1.6.x、1.7.x、およびnumpyマスターでも動作します。

本当に正しいのは、Cythonがdtypes / ufuncsのサイズにABIを壊すような方法で変更があった場合にのみ警告を発行し、それ以外の場合はサイレントにすることです。

その結果、Cythonの開発者は手作業バイナリ互換性を維持するという派手なチームを信頼することに同意したので、ABIの変更を壊したバージョンを使用すると、特別に細工された例外またはその他の明示的な表示ストッパーが生成されると予想できます。


¹ 以前に利用できる--no-use-wheelオプションが削除されましたので、pip 10.0.0


1
ドキュメントリンク:--no-binary要件ファイルの要件ごとのオーバーライド。また、私はのpandasためにここに来たので、ここに関連するpandasGitHubの問題があります。
eacousineau

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

これは機能しています。


6
誤って、その警告を静めるコードが1.14.5と1.15.0の間で削除されました。この修正は、 2018年8月の終わりまでに出なければなりません1.15.1バグ修正リリースの一部である
mattip

3
@mattipに感謝します。pip install numpy==1.15.11.15.0から1.15.1になり、警告メッセージは消えました。
keithpjolley

numpy 1.15.0では、PyTablesバージョン3.4.4およびH5Pyバージョン2.8.0をインポートすると、上記のレポート警告メッセージが表示されました。Numpyバージョン1.15.1をインストールすると警告が消えました。
マレーグマ

8

アナコンダ環境にいる場合は、次を使用します。

conda update --all

2
または私のために働いた派手なだけを更新します:conda update numpy
Dan King

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 

お役に立てば幸いです。


11
Py2バージョンをアンインストールし、Py3バージョンをインストールした。
パーカッション

python3バージョンをインストールすると、私の問題も解決したようです。
Menuka Ishan

を含むバイナリパッケージnumpyをPyPIからではなく公式のディストリビューションのリポジトリからインストールする場合、もちろんそれらはすべて同じに対してコンパイルされnumpyます。欠点は、最新バージョンを入手できない可能性があることです。
ivan_pozdeev 2018

7

numpyモジュールをアップグレードするだけで、現在は1.15.4です。窓用

pip install numpy --upgrade

1

このエラーは、インストールされたパッケージが異なるバージョンのnumpyでビルドされたために発生します。
ローカルに対してscipyとscikit-learnを再構築する必要があり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、パッケージscipy、scikit-learnのバイナリを無視することを渡しました。助けてくれなかった


0

メタ情報:sklearnのインストールに推奨される方法

numpyとscipyのインストールが既に機能している場合、scikit-learnをインストールする最も簡単な方法は、 pip

pip install -U scikit-learn 

またはconda

conda install scikit-learn

[... pipを使用してソースからコンパイルしないでください]

すでにnumpyのscipyのダウンロードとでPythonのインストールをお持ちでない場合、我々はあなたのパッケージマネージャを介して、またはいずれかを介してインストールすることをお勧めのpython バンドル。これらには、numpy、scipy、scikit-learn、matplotlib、およびその他多くの役立つ科学およびデータ処理ライブラリが付属しています。



-3

私の環境は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

そしてそれは機能します:役に立たない警告は表示されません。


3
オプション--no-use-wheelは削除されました。--no-binary :all:代わりに使用してください。
jmlarson

-5

scipyをインポートすると、エラー情報に「RuntimeWarning:builtin .type size changed」と表示され、バイナリの非互換性を示している可能性があります。期待されるzd、zdを取得

Pythonのバージョンを2.7.2から2.7.13に更新することでこの問題を解決しました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.