RuntimeWarning: Die Größe von numpy.dtype wurde geändert und weist möglicherweise auf eine binäre Inkompatibilität hin

148

Ich habe diesen Fehler beim Versuch, ein gespeichertes SVM-Modell zu laden. Ich habe versucht, sklearn, NumPy und SciPy zu deinstallieren und die neuesten Versionen erneut zusammen zu installieren (mithilfe von pip). Ich erhalte immer noch diesen Fehler. Warum?

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

UPDATE: OK, folgen Sie hier und

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

Der Fehler ist jetzt verschwunden, obwohl ich immer noch keine Ahnung habe, warum er überhaupt aufgetreten ist ...

Blue482
quelle
3
--no-use-wheelKompiliert das Modul von der Quelle neu mit dem, was Sie auf Ihrem System haben.
ivan_pozdeev
17
In neueren Versionen von pip wurde dieser Befehl in umbenannt --no-binary.
s_kirkiles
1
Ja, das hat bei mir funktioniert : pip install --no-binary :all: pandas. FWIW Ich war immer dieser Fehler auf einem frisches VE baut auf der Python - Version Python 3.6.6 :: Anaconda, Inc.mit nur requestsund pandasin der Umgebung installiert.
Safay
Sollte jetzt in Cython 0.29 behoben werden, wie unten
Mattip
Sie müssen auch installieren, gfortrandamit scipy kompiliert:sudo apt install gfortran
ma3oun

Antworten:

145

Laut MAINT: Cython warnt vor Änderungen dtype / ufunc size. - numpy / numpy :

Diese Warnungen werden angezeigt, wenn Sie scipy (oder ein anderes Paket) importieren, das für eine ältere Anzahl kompiliert wurde, als installiert ist.

und die Prüfungen werden von Cython eingefügt (sind also in jedem damit kompilierten Modul vorhanden).

Kurz gesagt, diese Warnungen sollten im speziellen Fall von harmlos seinnumpy , und diese Nachrichten werden seitdem herausgefiltertnumpy 1.8 (der Zweig, auf den dieses Commit ging). While scikit-learn 0.18.1wird dagegen kompiliertnumpy 1.6.1 .

Um diese Warnungen selbst zu filtern , können Sie dasselbe tun wie mit dem Patch :

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

Natürlich können Sie numpystattdessen alle betroffenen Module von der Quelle mit pip install --no-binary :all:¹ gegen Ihr lokales Modul neu kompilieren, wenn Sie die Balls- Tools dafür haben.


Längere Geschichte: Der Befürworter des Patches behauptet, dass es kein spezifisches Risiko geben sollte numpy, und Pakete von Drittanbietern wurden absichtlich gegen ältere Versionen entwickelt:

[Alles gegen die aktuelle Anzahl neu aufzubauen] ist keine praktikable Lösung und sollte sicherlich nicht notwendig sein. Scipy (wie viele andere Pakete) ist mit einer Reihe von numpy-Versionen kompatibel. Wenn wir also scipy-Binärdateien verteilen, erstellen wir sie für die niedrigste unterstützte numpy-Version (ab sofort 1.5.1) und sie funktionieren auch mit 1.6.x, 1.7.x und numpy master.

Das wirklich Richtige wäre, wenn Cython nur dann Warnungen ausgibt, wenn sich die Größe von dtypes / ufuncs so ändert, dass der ABI beschädigt wird, und ansonsten schweigt.

Infolgedessen stimmten die Entwickler von Cython zu, dem Numpy-Team die Aufrechterhaltung der Binärkompatibilität von Hand anzuvertrauen , sodass wir wahrscheinlich erwarten können, dass die Verwendung von Versionen mit brechenden ABI-Änderungen zu einer speziell gestalteten Ausnahme oder einem anderen expliziten Show-Stopper führen würde.


¹ Die bisher verfügbare --no-use-wheelOption wurde entfernt , dapip 10.0.0 .

ivan_pozdeev
quelle
1
Doc Links: --no-binary, pro-Anforderung Überschreibungen für Anforderungen Dateien . Außerdem bin ich hierher gekommen pandas, also hier ist das relevante pandasGitHub-Problem .
eacousineau
35

Es ist die Ausgabe der neuen Numpy-Version (1.15.0)

Sie können numpy downgraden und dieses Problem wird behoben:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Schließlich wird die Version numpy 1.15.1 veröffentlicht, damit die Warnprobleme behoben werden.

sudo pip install numpy == 1.15.1

Das funktioniert ..

Parthiban Soundram
quelle
6
Aus Versehen wurde der Code, der diese Warnung beruhigt, zwischen 1.14.5 und 1.15.0 entfernt. Das Update ist Teil der Bugfix-Version
1.15.1
3
Danke @mattip. pip install numpy==1.15.1habe mich von 1.15.0 auf 1.15.1 gebracht und die Warnmeldungen sind verschwunden.
Keithpjolley
Mit numpy 1.15.0 wurde beim Importieren von PyTables Version 3.4.4 und H5Py Version 2.8.0 die obige Warnmeldung angezeigt. Die Warnung verschwand nach der Installation von Numpy Version 1.15.1.
Sun Bear
8

Wenn Sie sich in einer Anakonda-Umgebung befinden, verwenden Sie:

conda update --all
H. Shad
quelle
2
Oder aktualisieren Sie einfach nur numpy, was für mich funktioniert hat:conda update numpy
Dan King
8

Ich habe die oben genannten Methoden ausprobiert, aber nichts hat funktioniert. Aber das Problem war behoben, nachdem ich die Bibliotheken durch apt install installiert hatte.

Für Python3

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

Für Python2

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

Hoffentlich hilft das.

Hemanth Kumar Talla
quelle
11
Sie haben Py2-Versionen deinstalliert und die Py3-Versionen installiert.
Percusse
Die Installation von Python3-Versionen scheint auch mein Problem gelöst zu haben.
Menuka Ishan
Wenn Sie Binärpakete installieren, einschließlich numpyaus dem Repository der offiziellen Distribution und nicht aus PyPI, werden diese natürlich alle gegen dasselbe kompiliert numpy. Der Nachteil ist, dass Sie möglicherweise nicht die neuesten Versionen erhalten.
ivan_pozdeev
7

Aktualisieren Sie einfach Ihr numpy-Modul, jetzt ist es 1.15.4. Für Windows

pip install numpy --upgrade
satyam_sareen
quelle
1

Dieser Fehler tritt auf, weil die installierten Pakete für eine andere Version von numpy erstellt wurden.
Wir müssen scipy und scikit-learn gegen die lokalen wieder aufbauen numpy.

Für neue pip(in meinem Fall pip 18.0) funktionierte dies:

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

--no-binaryNimmt eine Liste mit Namen von Paketen, für die Sie Binärdateien ignorieren möchten. In diesem Fall haben wir bestanden, --no-binary scipy,scikit-learndie Binärdateien für Pakete scipy, scikit-learn ignorieren. Hat mir nicht geholfen

Temak
quelle
0

Meta-Informationen: Die empfohlene Methode zur Installation von sklearn

Wenn Sie bereits eine funktionierende Installation von numpy und scipy haben, können Sie scikit-learn am einfachsten installieren pip

pip install -U scikit-learn 

oder conda:

conda install scikit-learn

[... nicht mit pip aus der Quelle kompilieren]

Wenn Sie noch keine Python-Installation mit numpy und scipy haben, empfehlen wir die Installation entweder über Ihren Paketmanager oder über ein Python- Bundle . Diese werden mit Numpy, Scipy, Scikit-Learn, Matplotlib und vielen anderen hilfreichen wissenschaftlichen und Datenverarbeitungsbibliotheken geliefert.

serv-inc
quelle
0

Beachten Sie, dass es ab Cython 0.29 eine neue Option check_size gibt , mit der die Warnung an der Quelle entfernt wird. Daher sollten keine Problemumgehungen erforderlich sein, sobald diese Version in die verschiedenen Pakete gelangt

Mattip
quelle
-3

Meine Umgebung ist Python 2.7.15

ich versuche

pip uninstall
pip install --no-use-wheel

aber es funktioniert nicht. Es zeigt den Fehler:

keine solche Option: - no-use-Rad

Dann versuche ich:

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

Und es funktioniert: Die nutzlosen Warnungen werden nicht angezeigt.

Dan
quelle
3
Die Option --no-use-wheelwurde entfernt. Verwenden Sie --no-binary :all:stattdessen.
jmlarson
-5

Beim Import von Scipy werden folgende Fehlerinformationen angezeigt: RuntimeWarning: Die Größe des eingebauten Typs wurde geändert. Dies kann auf eine binäre Inkompatibilität hinweisen. Erwartet zd, bekam zd

Ich habe dieses Problem gelöst, indem ich die Python-Version von 2.7.2 auf 2.7.13 aktualisiert habe

Hao Xiang
quelle