RuntimeWarning: kích thước numpy.dtype đã thay đổi, có thể cho thấy sự không tương thích nhị phân


148

Tôi gặp lỗi này khi thử tải mô hình SVM đã lưu. Tôi đã thử gỡ cài đặt sklearn, NumPy và SciPy, cài đặt lại các phiên bản mới nhất cùng nhau (sử dụng pip). Tôi vẫn nhận được lỗi này. Tại sao?

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

CẬP NHẬT: OK, bằng cách theo dõi ở đây , và

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

Lỗi đã biến mất, mặc dù tôi vẫn không biết tại sao nó lại xảy ra ở nơi đầu tiên ...


3
--no-use-wheelbiên dịch lại mô-đun từ nguồn dựa trên bất cứ thứ gì bạn có trên hệ thống của mình.
ivan_pozdeev

17
Trong các phiên bản mới hơn của pip, lệnh này đã được đổi tên thành --no-binary.
s_kirkiles

1
Đúng, điều này làm việc cho tôi : pip install --no-binary :all: pandas. FWIW Tôi đã gặp lỗi này trên bản dựng VE mới trên phiên bản Python Python 3.6.6 :: Anaconda, Inc.chỉ requestspandasđược cài đặt trong môi trường.
safay

Bây giờ nên được sửa trong cython 0,29, như nhận xét bên dưới
mattip

Bạn cũng cần cài đặt gfortrancho scipy để biên dịch:sudo apt install gfortran
ma3oun

Câu trả lời:


145

Theo MAINT: im lặng Cython cảnh báo về thay đổi kích thước dtype / ufunc. - numpy / numpy :

Những cảnh báo này có thể nhìn thấy bất cứ khi nào bạn nhập scipy (hoặc gói khác) được biên dịch chống lại một numpy cũ hơn được cài đặt.

và các kiểm tra được chèn bởi Cython (do đó có mặt trong bất kỳ mô-đun nào được biên dịch cùng với nó).

Tóm lại, những cảnh báo này phải là lành tính trong trường hợp cụ thểnumpynhững thông điệp này được lọc ra từ đónumpy 1.8 (nhánh mà cam kết này đã đi vào). Trong khi scikit-learn 0.18.1được biên soạn chống lạinumpy 1.6.1 .

Để tự lọc các cảnh báo này , bạn có thể thực hiện tương tự như bản vá :

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

Tất nhiên, bạn chỉ có thể biên dịch lại tất cả các mô-đun bị ảnh hưởng từ nguồn so với cục bộ của bạnnumpy bằng pip install --no-binary :all:¹ thay vào đó nếu bạn có các công cụ bóng cho điều đó.


Câu chuyện dài hơn: tuyên bố đề xuất của bản vá sẽ không có rủi ro cụ thể numpyvà các gói của bên thứ 3 được xây dựng có chủ ý so với các phiên bản cũ hơn:

[Xây dựng lại mọi thứ chống lại sự khó chịu hiện tại] không phải là một giải pháp khả thi và chắc chắn không cần thiết. Scipy (như nhiều gói khác) tương thích với một số phiên bản của numpy. Vì vậy, khi chúng tôi phân phối các nhị phân scipy, chúng tôi xây dựng chúng theo phiên bản numpy được hỗ trợ thấp nhất (1.5.1 tính đến thời điểm hiện tại) và chúng cũng hoạt động với 1.6.x, 1.7.x và master numpy.

Chính xác thực sự chỉ dành cho Cython khi đưa ra cảnh báo khi kích thước của dtypes / ufuncs thay đổi theo cách phá vỡ ABI và im lặng.

Do đó, các nhà phát triển của Cython đã đồng ý tin tưởng nhóm numpy bằng cách duy trì khả năng tương thích nhị phân bằng tay , vì vậy chúng tôi có thể mong đợi rằng việc sử dụng các phiên bản phá vỡ các thay đổi ABI sẽ mang lại một ngoại lệ được chế tạo đặc biệt hoặc một số công cụ chặn hiển thị rõ ràng khác.


¹ Các trước đây có sẵn --no-use-wheeltùy chọn đã được gỡ bỏ từpip 10.0.0 .


1
Tài liệu liên kết : --no-binary, ghi đè theo yêu cầu cho các tệp yêu cầu . Ngoài ra, tôi đến đây pandasvì vậy đây là pandasvấn đề GitHub có liên quan .
eacousineau

35

Đây là vấn đề của phiên bản numpy mới (1.15.0)

Bạn có thể hạ cấp numpy và vấn đề này sẽ được khắc phục:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Cuối cùng, phiên bản 1.15.1 numpy được phát hành để các vấn đề cảnh báo được khắc phục.

sudo pip cài đặt numpy == 1.15.1

Đây là làm việc ..


6
Do nhầm lẫn, mã làm im lặng cảnh báo đó đã bị xóa trong khoảng từ 1.14.5 đến 1.15.0. Bản sửa lỗi là một phần của bản phát hành lỗi 1.15.1, sẽ được phát hành vào cuối tháng 8 năm 2018
mattip

3
Cảm ơn @mattip. pip install numpy==1.15.1đưa tôi từ 1.15.0 đến 1.15.1 và các tin nhắn cảnh báo biến mất.
keithpjcar

Với numpy 1.15.0, tôi đã nhận được thông báo cảnh báo báo cáo ở trên khi nhập PyTables phiên bản 3.4.4 và H5Py phiên bản 2.8.0. Cảnh báo biến mất sau khi cài đặt Numpy phiên bản 1.15.1.
Gấu chó

8

nếu bạn đang ở trong môi trường anaconda, hãy sử dụng:

conda update --all

2
Hoặc cập nhật chỉ là numpy mà làm việc cho tôi:conda update numpy
Dan King

8

Tôi đã thử các cách nêu trên, nhưng không có gì hiệu quả. Nhưng vấn đề đã biến mất sau khi tôi cài đặt các thư viện thông qua cài đặt apt,

Đối với Python3,

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

Đối với Python2,

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

Mong rằng sẽ giúp.


11
bạn đã gỡ cài đặt các phiên bản Py2 và cài đặt các phiên bản Py3.
percusse

Có vẻ như cài đặt phiên bản python3 cũng giải quyết vấn đề của tôi.
Menuka Ishan

Nếu bạn cài đặt các gói nhị phân, bao gồm numpy, từ kho lưu trữ của bản phân phối chính thức thay vì từ PyPI, tất nhiên tất cả chúng đều được biên dịch theo cùng một thứ numpy. Nhược điểm là bạn có thể không nhận được các phiên bản mới nhất.
ivan_pozdeev

7

Chỉ cần nâng cấp mô-đun numpy của bạn, ngay bây giờ nó là 1.15.4. Cho cửa sổ

pip install numpy --upgrade

1

Lỗi này xảy ra do các gói đã cài đặt được xây dựng lại phiên bản khác của numpy.
Chúng ta cần xây dựng lại scipy và scikit-learn chống lại địa phương numpy.

Đối với mới pip(trong trường hợp của tôi pip 18.0), điều này đã làm việc:

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

--no-binarylấy một danh sách tên của các gói mà bạn muốn bỏ qua nhị phân cho. Trong trường hợp này, chúng tôi đã thông qua --no-binary scipy,scikit-learnđó sẽ bỏ qua các tệp nhị phân cho các gói scipy, scikit-learn. Không giúp tôi


0

Thông tin tổng hợp: Cách khuyến nghị để cài đặt sklearn

Nếu bạn đã có một bản cài đặt hoạt động của numpy và scipy, cách dễ nhất để cài đặt scikit-learn là sử dụng pip

pip install -U scikit-learn 

hoặc conda:

conda install scikit-learn

[... không biên dịch từ nguồn bằng pip]

Nếu bạn chưa có một cài đặt python với NumPy và scipy, chúng tôi khuyên bạn nên cài đặt hoặc thông qua quản lý gói của bạn hoặc thông qua một python . Chúng đi kèm với numpy, scipy, scikit-learn, matplotlib và nhiều thư viện xử lý dữ liệu và khoa học hữu ích khác.


0

Lưu ý rằng kể từ cython 0.29, có một tùy chọn check_size mới giúp loại bỏ cảnh báo tại nguồn, do đó không cần xử lý xung quanh một khi phiên bản đó thấm vào các gói khác nhau


-3

Môi trường của tôi là Python 2.7.15

tôi thử

pip uninstall
pip install --no-use-wheel

Nhưng nó không hoạt động. Nó hiển thị lỗi:

không có tùy chọn như vậy: --no-use-wheel

Sau đó tôi thử:

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

Và nó hoạt động: các cảnh báo vô dụng không hiển thị.


3
Các tùy chọn --no-use-wheelđã được gỡ bỏ. Sử dụng --no-binary :all:thay thế.
jmlarson

-5

Khi nhập scipy, thông tin lỗi hiển thị: RuntimeWarning: kích thước dựng sẵn .type đã thay đổi, có thể cho thấy sự không tương thích nhị phân. Dự kiến ​​zd, có zd

Tôi đã giải quyết vấn đề này bằng cách cập nhật phiên bản python từ 2.7.2 lên 2.7.13

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.