RuntimeWarning: la dimensione numpy.dtype è cambiata, può indicare incompatibilità binaria


148

Ho questo errore per provare a caricare un modello SVM salvato. Ho provato a disinstallare sklearn, NumPy e SciPy, reinstallando di nuovo tutte le versioni più recenti (usando pip). Ricevo ancora questo errore. Perché?

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

AGGIORNAMENTO: OK, seguendo qui e

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

L'errore ora è scomparso, anche se non ho ancora idea del perché si sia verificato in primo luogo ...


3
--no-use-wheelricompila il modulo dalla sorgente contro qualsiasi cosa tu abbia sul tuo sistema.
ivan_pozdeev,

17
Nelle versioni più recenti di pip questo comando è stato rinominato --no-binary.
s_kirkiles,

1
Sì, questo ha funzionato per me: pip install --no-binary :all: pandas. FWIW Stavo ottenendo questo errore su una nuova build VE in cima alla versione di Python Python 3.6.6 :: Anaconda, Inc.con solo requestse pandasinstallato nell'ambiente.
safay

Ora dovrebbe essere corretto in cython 0.29, come commentato di seguito
mattip

Devi anche installare gfortranper compilare sudo apt install gfortran
scipy

Risposte:


145

Secondo MAINT: silenzia gli avvertimenti di Cython in merito alle modifiche alla dimensione del tipo / ufunc. - intorpidimento / intorpidimento :

Questi avvisi sono visibili ogni volta che importi scipy (o un altro pacchetto) che è stato compilato su un vecchio numpy di quello installato.

e i controlli sono inseriti da Cython (quindi sono presenti in qualsiasi modulo compilato con esso).

Per farla breve, questi avvisi dovrebbero essere benigni nel caso particolare dinumpy , e questi messaggi vengono filtrati da alloranumpy 1.8 (il ramo su cui è stato eseguito questo commit). Mentre scikit-learn 0.18.1è compilato contronumpy 1.6.1 .

Per filtrare questi avvisi tu stesso , puoi fare lo stesso della patch :

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

Ovviamente, puoi semplicemente ricompilare tutti i moduli interessati dalla sorgente al tuo localenumpy con pip install --no-binary :all:¹ invece se hai gli strumenti a sfera per quello.


Storia più lunga: i sostenitori della patch affermano che non dovrebbe esserci alcun rischio specifico numpye pacchetti di terze parti sono stati creati intenzionalmente rispetto alle versioni precedenti:

[Ricostruire tutto contro l'attuale intorpidimento non è] una soluzione fattibile, e certamente non dovrebbe essere necessario. Scipy (come molti altri pacchetti) è compatibile con un numero di versioni di numpy. Quindi quando distribuiamo i binari di scipy, li costruiamo sulla versione numpy più bassa supportata (1.5.1 a partire da ora) e funzionano anche con 1.6.x, 1.7.xe master numpy.

Il vero corretto sarebbe che Cython emettesse avvisi solo quando la dimensione di dtypes / ufuncs cambia in un modo che rompe l'ABI e tace altrimenti.

Di conseguenza, gli sviluppatori di Cython hanno concordato di fidarsi del team intorpidito nel mantenere la compatibilità binaria a mano , quindi possiamo probabilmente aspettarci che l'uso di versioni con interruzioni delle modifiche ABI produrrebbe un'eccezione appositamente predisposta o qualche altro esplicito blocco dello spettacolo.


¹ L' --no-use-wheelopzione precedentemente disponibile è stata rimossa da allorapip 10.0.0 .


1
Link Doc: --no-binary, le sostituzioni per-requisito per i file requisiti . Inoltre, sono venuto qui per pandas, quindi ecco il pandasproblema rilevante di GitHub .
eacousineau,

35

È il problema della nuova versione numpy (1.15.0)

Puoi eseguire il downgrade numpy e questo problema verrà risolto:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Alla fine viene rilasciata la versione numpy 1.15.1, quindi i problemi di avviso vengono risolti.

sudo pip install numpy == 1.15.1

Questo sta funzionando ..


6
Per errore il codice che elimina tale avviso è stato rimosso tra 1.14.5 e 1.15.0. La correzione fa parte della versione 1.15.1 bugfix, che dovrebbe essere disponibile entro la fine di agosto 2018
mattip

3
Grazie @mattip. pip install numpy==1.15.1mi ha portato dalla 1.15.0 alla 1.15.1 e i messaggi di avvertimento sono spariti.
keithpjolley,

Con numpy 1.15.0, ho ricevuto il messaggio di avviso di cui sopra durante l'importazione di PyTables versione 3.4.4 e H5Py versione 2.8.0. L'avviso è scomparso dopo l'installazione di Numpy versione 1.15.1.
Sun Bear

8

se ti trovi in ​​un ambiente anaconda usa:

conda update --all

2
O aggiorna solo numpy che ha funzionato per me:conda update numpy
Dan King,

8

Ho provato i modi sopra menzionati, ma nulla ha funzionato. Ma il problema era scomparso dopo aver installato le librerie tramite apt install,

Per Python3,

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

Per Python2,

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

Spero che aiuti.


11
hai disinstallato le versioni di Py2 e installato quelle di Py3.
percusse il

Sembra che anche l'installazione delle versioni di python3 abbia risolto il mio problema.
Menuka Ishan,

Se installi pacchetti binari, incluso numpy, dal repository della distro ufficiale piuttosto che da PyPI, ovviamente sono tutti compilati in base allo stesso numpy. L'aspetto negativo è che potresti non ricevere le ultime versioni.
ivan_pozdeev,

7

Basta aggiornare il modulo numpy, in questo momento è 1.15.4. Per windows

pip install numpy --upgrade

1

Questo errore si verifica perché i pacchetti installati sono stati compilati con versioni diverse di numpy.
Dobbiamo ricostruire scipy e scikit-learn contro il locale numpy.

Per i nuovi pip(nel mio caso pip 18.0) ha funzionato:

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

--no-binaryprende un elenco di nomi di pacchetti per i quali si desidera ignorare i file binari. In questo caso abbiamo superato --no-binary scipy,scikit-learnche ignorerà i binari per i pacchetti scipy, scikit-learn. Non mi ha aiutato


0

Meta-informazioni: il modo raccomandato per installare sklearn

Se hai già un'installazione funzionante di numpy e scipy, il modo più semplice per installare scikit-learn è usare pip

pip install -U scikit-learn 

oppure conda:

conda install scikit-learn

[... non compilare dal sorgente usando pip]

Se non disponi già di un'installazione Python con numpy e scipy, ti consigliamo di installarla tramite il gestore pacchetti o tramite un pacchetto python . Questi sono dotati di numpy, scipy, scikit-learn, matplotlib e molte altre utili librerie scientifiche e di elaborazione dei dati.



-3

Il mio ambiente è Python 2.7.15

provo

pip uninstall
pip install --no-use-wheel

ma non funziona. Mostra l'errore:

nessuna opzione del genere: --no-use-wheel

Quindi provo:

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

E funziona: gli avvertimenti inutili non mostrano.


3
L'opzione --no-use-wheelè stata rimossa. Usa --no-binary :all:invece.
jmlarson,

-5

Durante l'importazione di scipy, le informazioni sull'errore mostrano: RuntimeWarning: la dimensione del tipo di builtin è stata modificata, può indicare incompatibilità binaria. Previsto zd, ottenuto zd

Ho risolto questo problema aggiornando la versione di Python dalla 2.7.2 alla 2.7.13

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.