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

ОНОВЛЕННЯ: Добре, дотримуючись тут , і

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 Я отримував цю помилку у свіжому складі VE поверх версії Python Python 3.6.6 :: Anaconda, Inc.з єдиною requestsта pandasвстановленою в оточенні.
сафай

Має бути зафіксовано зараз у cython 0.29, як це прокоментується нижче
mattip

Вам також потрібно встановити gfortranдля scipy, щоб скласти:sudo apt install gfortran
ma3oun

Відповіді:


145

Згідно з 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 призведе до спеціально створеного винятку чи іншої явної зупинки шоу.


Available Раніше доступна --no-use-wheelопція була видалена з тих пірpip 10.0.0 .


1
Doc посилання: --no-binary, в-вимога перевизначення для вимог файлів . Також я завітав сюди pandas, тому ось відповідне pandasпитання GitHub .
eacousineau

35

Це випуск нової верхової версії (1.15.0)

Ви можете понизити число, і ця проблема буде виправлена:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Нарешті випущена версія num5 1.15.1, щоб виправити проблеми попередження.

встановити sudo pip numpy == 1.15.1

Це працює ..


6
Помилково код, який видаляє це попередження, було знято між 1.14.5 та 1.15.0. Виправлення є частиною випуску 1.15.1 BUGFIX, який повинен бути вже до кінця серпня 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
Або оновлення просто нудне, що працювало на мене: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

Просто оновіть свій нудний модуль, зараз це 1.15.4. Для вікон

pip install numpy --upgrade

1

Ця помилка виникає через те, що встановлені пакети створювали різні версії numpy.
Нам потрібно відновити науку та науку на науці проти місцевих 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, ми рекомендуємо встановити або з допомогою менеджера пакетів або з допомогою в Пітоні пачки . Вони оснащені numpy, scipy, scikit-learn, matplotlib та багатьма іншими корисними науковими бібліотеками та обробкою даних.


0

Зауважте, що щодо cython 0.29 є новий параметр check_size, який виключає попередження у джерела, тому жодних робочих обрізків не потрібно, як тільки ця версія переноситься на різні пакети


-3

Моє оточення - Python 2.7.15

я спробую

pip uninstall
pip install --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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.