web-dev-qa-db-fra.com

RuntimeWarning: la taille de numpy.dtype a été modifiée, ce qui peut indiquer une incompatibilité binaire

J'ai cette erreur en essayant de charger un modèle SVM enregistré. J'ai essayé de désinstaller sklearn, NumPy et SciPy, puis de réinstaller toutes les versions les plus récentes (en utilisant pip). Je reçois toujours cette erreur. Pourquoi?

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, en suivant ici , et

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

L'erreur a maintenant disparu, bien que je ne sache toujours pas pourquoi elle s'est produite en premier lieu ...

113
Blue482

Selon MAINT: supprime les avertissements de Cython concernant les modifications de la taille du type/ufunc. - numpy/numpy :

Ces avertissements sont visibles à chaque fois que vous importez scipy (ou un autre paquet ) Compilé avec un numpy plus ancien que celui installé.

et les contrôles sont insérés par Cython (sont donc présents dans tout module compilé avec lui).

En résumé, ces avertissements devraient être bénins dans le cas particulier de numpy, et ces messages sont filtrés depuis numpy 1.8 (la branche sur laquelle cette validation est passée). Tant que scikit-learn 0.18.1 EST COMPIL&EACUTE; AVEC numpy 1.6.1 .

Pour filtrer vous-même ces avertissements, vous pouvez faire la même chose comme le fait le patch :

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

Bien sûr, vous pouvez simplement recompiler tous les modules concernés à partir de la source avec votre numpy locale avec pip install --no-binary :all:¹ à la place si vous avez le des balles des outils pour ça.


Histoire plus longue: le promoteur du patch affirme il ne devrait y avoir de risque spécifique avec numpy, et les packages tiers sont construits intentionnellement par rapport à des versions plus anciennes:

[Reconstruire tout ce qui est contre numpy actuel] n’est pas faisable solution, et ne devrait certainement pas être nécessaire. Scipy (comme beaucoup d'autres Packages) est compatible avec plusieurs versions de numpy. Alors, quand nous distribuons des binaires scipy, nous les construisons par rapport au plus bas supporté version numpy (1.5.1 à partir de maintenant) et ils fonctionnent avec 1.6.x, 1.7.x et Numpy Master aussi.

Le vrai correct serait que Cython n’émette des avertissements que lorsque La taille de dtypes/ufuncs a des modifications qui cassent le ABI et deviennent silencieux autrement.

En conséquence, les développeurs de Cython ont accepté de confier à la main de numpy le maintien de la compatibilité binaire . Nous pouvons donc nous attendre à ce que l’utilisation de versions comportant des modifications ABI inattendues génère une exception spécialement conçue ou un autre système d’affichage explicite.


¹L'option --no-use-wheel précédemment disponible a été supprimée depuis pip 10.0.0 .

127
ivan_pozdeev

C'est la question de la nouvelle version de Numpy (1.15.0)

Vous pouvez rétrograder numpy et ce problème sera résolu: 

Sudo pip uninstall numpy
Sudo pip install numpy==1.14.5

Enfin, numpy version 1.15.1 est disponible, les problèmes d’avertissement sont résolus.

Sudo pip install numpy == 1.15.1

Cela fonctionne ..

35
Parthiban.S

J'ai essayé les méthodes mentionnées ci-dessus, mais rien n'a fonctionné. Mais le problème avait disparu après avoir installé les bibliothèques via apt install,

Pour Python3,

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

Pour Python2,

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

J'espère que cela pourra aider.

7
Hemanth Kumar Talla

si vous êtes dans un environnement anaconda, utilisez:

conda update --all
4
H. Shad

Il suffit de mettre à jour votre module numpy, il est actuellement 1.15.4. Pour les fenêtres

pip install numpy --upgrade
1
satyam_sareen

Cette erreur se produit car les packages installés ont été compilés selon une version différente de numpy.
Nous devons reconstruire scipy et scikit-learn par rapport à la variable locale numpy.

Pour new pip (dans mon cas, pip 18.0), cela a fonctionné:

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

--no-binary prend une liste de noms de packages pour lesquels vous souhaitez ignorer les fichiers binaires. Dans ce cas, nous avons passé --no-binary scipy,scikit-learn qui ignorera les fichiers binaires des paquets scipy, scikit-learn . Ne m'a pas aidé

1
Temak

Notez que depuis la version 0.29 de cython, il existe une nouvelle option check_size qui élimine l’avertissement à la source. Par conséquent, aucune solution de rechange ne devrait être nécessaire une fois que cette version a été transférée dans les différents packages

0
mattip

Méta-informations: La manière recommandée d'installer sklearn

Si vous avez déjà une installation fonctionnelle de numpy et scipy, le fichier Le moyen le plus simple d'installer scikit-learn est d'utiliser pip

pip install -U scikit-learn 

ou conda:

conda install scikit-learn

[... ne compilez pas depuis la source en utilisant pip]

Si vous ne possédez pas déjà d’installation python avec numpy et scipy, nous vous recommandons d’installer via votre gestionnaire de paquets ou via apythonbundle . Celles-ci viennent avec numpy, scipy, scikit-learn, matplotlib et de nombreuses autres bibliothèques scientifiques et informatiques utiles.

0
serv-inc