RuntimeWarning: размер numpy.dtype изменен, может указывать на двоичную несовместимость

149

У меня есть эта ошибка при попытке загрузить сохраненную модель 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

ОБНОВЛЕНИЕ: хорошо, следуя здесь , и

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

Ошибка теперь ушла, хотя я до сих пор не знаю, почему она возникла ...

Blue482
источник
3
--no-use-wheelперекомпилирует модуль из исходного кода против того, что у вас есть в вашей системе.
ivan_pozdeev
17
В более новых версиях pip эта команда была переименована --no-binary.
s_kirkiles
1
Да, это сработало для меня pip install --no-binary :all: pandas. Я получил эту ошибку в новой сборке VE поверх версии Python Python 3.6.6 :: Anaconda, Inc.с только requestsи pandasустановленной в среде.
Safay
Должно быть исправлено в Cython 0.29, как прокомментировано ниже
mattip
Вам также нужно установить gfortranscipy для компиляции:sudo apt install gfortran
ma3oun

Ответы:

146

Согласно MAINT: молчание предупреждений Cython об изменении размера dtype / ufunc. - NumPy / NUMPY :

Эти предупреждения видны всякий раз, когда вы импортируете scipy (или другой пакет), который был скомпилирован для более старого numpy, чем установленный.

и проверки вставляются 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")

Конечно, вы можете просто перекомпилировать все затронутые модули из источника против вашего локальногоnumpy с pip install --no-binary :all:¹ вместо если у вас есть шары инструментов для этого.


Более длинная история: сторонник патча утверждает, что не должно быть никакого риска, особенно numpy, и сторонние пакеты специально созданы для более старых версий:

[Восстановление всего против нынешнего обмана -] нереальное решение и, конечно, не должно быть необходимым. Scipy (как и многие другие пакеты) совместим с рядом версий Numpy. Поэтому, когда мы распространяем двоичные файлы scipy, мы строим их на основе самой низкой поддерживаемой версии numpy (на данный момент 1.5.1), и они работают также с 1.6.x, 1.7.x и numpy master.

На самом деле правильным было бы, чтобы Cython только выдавал предупреждения, когда размер dtypes / ufuncs изменяется таким образом, что нарушает ABI, и молчал в противном случае.

В результате разработчики Cython согласились доверить команде NumPy поддержку бинарной совместимости вручную , поэтому мы, вероятно, можем ожидать, что использование версий с нарушением ABI приведет к специально созданному исключению или некоторому другому явному ограничителю show.


Since Ранее доступная --no-use-wheelопция была удалена с тех порpip 10.0.0 .

ivan_pozdeev
источник
1
Doc ссылка: --no-binary, в-требование переопределение для требований файлов . Кроме того, я пришел сюда pandas, так что вот соответствующая pandasпроблема GitHub .
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. Это исправление является частью релиза исправления 1.15.1, который должен быть выпущен к концу августа 2018 года
mattip
3
Спасибо @mattip. pip install numpy==1.15.1получил меня от 1.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
Или обновление просто NumPy, который работал для меня:conda update numpy
Дэн Кинг
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 тоже решила мою проблему.
Менека Ишан
Если вы устанавливаете бинарные пакеты, в том числе numpyиз официального дистрибутива дистрибутива, а не из PyPI, конечно, все они будут скомпилированы с тем же numpy. Недостатком является то, что вы можете не получать последние версии.
ivan_pozdeev
7

Просто обновите свой модуль numpy, сейчас он 1.15.4. Для окон

pip install numpy --upgrade
satyam_sareen
источник
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. Не помогло мне

Temak
источник
0

Мета-информация: рекомендуемый способ установки склеарна

Если у вас уже есть работающая установка numpy и scipy, самый простой способ установить scikit-learn - это использовать pip

pip install -U scikit-learn 

или conda:

conda install scikit-learn

[... не компилировать из источника используя pip]

Если вы уже не имеете установки питона с NumPy и SciPy, мы рекомендуем установить либо с помощью менеджера пакетов или с помощью в питоне пачки . К ним относятся numpy, scipy, scikit-learn, matplotlib и многие другие полезные научные библиотеки и библиотеки для обработки данных.

Serv-вкл
источник
0

Обратите внимание, что в Cython 0.29 появилась новая опция check_size, которая устраняет предупреждение в источнике, поэтому никаких обходных путей не требуется, когда эта версия просачивается в различные пакеты.

mattip
источник
-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: встроенный размер .type изменен, может указывать на двоичную несовместимость. Ожидаемый ZD, получил ZD

Я решил эту проблему путем обновления версии Python с 2.7.2 до 2.7.13

Хао Сян
источник