RuntimeWarning: ukuran numpy.dtype berubah, dapat mengindikasikan ketidakcocokan biner

148

Saya memiliki kesalahan ini karena mencoba memuat model SVM yang disimpan. Saya telah mencoba menghapus sklearn, NumPy dan SciPy, menginstal ulang versi terbaru secara bersamaan (menggunakan pip). Saya masih mendapatkan kesalahan ini. Mengapa?

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

PEMBARUAN: OK, dengan mengikuti di sini , dan

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

Kesalahan sekarang telah hilang, meskipun saya masih tidak tahu mengapa itu terjadi di tempat pertama ...

Blue482
sumber
3
--no-use-wheelmengkompilasi ulang modul dari sumber terhadap apa pun yang Anda miliki di sistem Anda.
ivan_pozdeev
17
Dalam versi pip yang lebih baru, perintah ini telah diubah namanya menjadi --no-binary.
s_kirkiles
1
Yap, ini bekerja untuk saya: pip install --no-binary :all: pandas. FWIW Saya mendapatkan kesalahan ini pada VE build baru di atas versi Python Python 3.6.6 :: Anaconda, Inc.dengan hanya requestsdan pandasdiinstal di lingkungan.
safay
Harus diperbaiki sekarang di cython 0.29, seperti yang dikomentari di bawah ini
mattip
Anda juga perlu menginstal gfortranuntuk scipy untuk mengkompilasi:sudo apt install gfortran
ma3oun

Jawaban:

145

Menurut MAINT: silence peringatan Cython tentang perubahan ukuran dtype / ufunc. - numpy / numpy :

Peringatan ini terlihat setiap kali Anda mengimpor scipy (atau paket lain) yang dikompilasi terhadap numpy yang lebih tua dari yang diinstal.

dan pemeriksaan dimasukkan oleh Cython (karenanya ada dalam setiap modul yang dikompilasi dengannya).

Singkatnya, peringatan ini harus jinak dalam kasus tertentunumpy , dan pesan-pesan ini disaring sejaknumpy 1.8 (cabang dari komit ini pergi ke). Sementara scikit-learn 0.18.1dikompilasi melawannumpy 1.6.1 .

Untuk memfilter peringatan ini sendiri , Anda dapat melakukan hal yang sama seperti yang dilakukan patch :

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

Tentu saja, Anda hanya dapat mengkompilasi ulang semua modul yang terkena dampak dari sumber terhadap lokal Andanumpy dengan pip install --no-binary :all:¹ sebagai gantinya jika Anda memiliki alat bola untuk itu.


Kisah yang lebih panjang: pengusul klaim mengklaim tidak boleh ada risiko khusus numpy, dan paket pihak ke-3 sengaja dibuat untuk versi yang lebih lama:

[Membangun kembali segala sesuatu terhadap numpy saat ini] bukan solusi yang layak, dan tentunya tidak perlu. Scipy (karena banyak paket lain) kompatibel dengan sejumlah versi numpy. Jadi ketika kami mendistribusikan binari yang cerdik, kami membangunnya dengan versi numpy terendah yang didukung (1.5.1 sekarang) dan mereka bekerja dengan 1.6.x, 1.7.x dan numpy master juga.

Yang benar sebenarnya adalah untuk Cython hanya untuk mengeluarkan peringatan ketika ukuran dtypes / ufuncs telah berubah dengan cara yang menghancurkan ABI, dan diam jika tidak.

Sebagai hasilnya, pengembang Cython setuju untuk mempercayai tim numpy dengan menjaga kompatibilitas biner dengan tangan , jadi kita mungkin bisa berharap bahwa menggunakan versi dengan melanggar perubahan ABI akan menghasilkan pengecualian yang dibuat khusus atau beberapa show-stopper eksplisit lainnya.


¹ Opsi yang tersedia sebelumnya --no-use-wheeltelah dihapus sejakpip 10.0.0 .

ivan_pozdeev
sumber
1
Doc link: --no-binary, per-persyaratan menimpa file persyaratan . Saya juga datang ke sini pandas, jadi inilah pandasmasalah GitHub yang relevan .
eacousineau
35

Ini masalah versi numpy baru (1.15.0)

Anda dapat menurunkan versi numpy dan masalah ini akan diperbaiki:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Akhirnya versi 1.15.1 numpy dirilis sehingga masalah peringatan diperbaiki.

sudo pip install numpy == 1.15.1

Ini bekerja ..

Parthiban Soundram
sumber
6
Secara tidak sengaja kode yang menghentikan peringatan itu dihapus antara 1.14.5 dan 1.15.0. The memperbaiki adalah bagian dari rilis 1.15.1 bugfix, yang harus keluar pada akhir Agustus 2018
mattip
3
Terima kasih @attip. pip install numpy==1.15.1membuat saya dari 1.15.0 ke 1.15.1 dan pesan peringatan hilang.
keithpjolley
Dengan numpy 1.15.0, saya mendapat pesan laporan peringatan di atas ketika mengimpor PyTables versi 3.4.4 dan H5Py versi 2.8.0. Peringatan itu hilang setelah menginstal Numpy versi 1.15.1.
Sun Bear
8

jika Anda berada di lingkungan anaconda gunakan:

conda update --all
H. Shad
sumber
2
Atau pembaruan hanya numpy yang bekerja untuk saya:conda update numpy
Dan King
8

Saya sudah mencoba cara yang disebutkan di atas, tetapi tidak ada yang berhasil. Tapi masalah itu hilang setelah saya menginstal perpustakaan melalui apt install,

Untuk Python3,

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

Untuk Python2,

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

Semoga itu bisa membantu.

Hemanth Kumar Talla
sumber
11
Anda menghapus versi Py2 dan menginstal versi Py3.
perkusi
Tampaknya Menginstal versi python3 juga memecahkan masalah saya.
Menuka Ishan
Jika Anda menginstal paket biner, termasuk numpy, dari repositori distro resmi daripada dari PyPI, tentu saja mereka semua dikompilasi dengan yang sama numpy. Kelemahannya adalah Anda mungkin tidak mendapatkan versi terbaru.
ivan_pozdeev
7

Cukup tingkatkan modul numpy Anda, saat ini 1.15.4. Untuk windows

pip install numpy --upgrade
satyam_sareen
sumber
1

Kesalahan ini terjadi karena paket yang diinstal dibangun berbeda versi numpy.
Kita perlu membangun kembali scipy dan scikit-belajar melawan lokal numpy.

Untuk yang baru pip(dalam kasus saya pip 18.0) ini berfungsi:

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

--no-binarymengambil daftar nama paket yang ingin Anda abaikan binari. Dalam hal ini kami melewati --no-binary scipy,scikit-learnyang akan mengabaikan binari untuk paket scipy, scikit-learn. Tidak membantu saya

Temak
sumber
0

Meta-informasi: Cara yang disarankan untuk menginstal sklearn

Jika Anda sudah memiliki instalasi numpy dan scipy yang berfungsi, cara termudah untuk menginstal scikit-learn adalah menggunakan pip

pip install -U scikit-learn 

atau conda:

conda install scikit-learn

[... jangan kompilasi dari sumber menggunakan pip]

Jika Anda belum memiliki instalasi python dengan numpy dan scipy, kami sarankan untuk menginstal baik melalui manajer paket Anda atau melalui sebuah python bundel . Ini datang dengan numpy, scipy, scikit-belajar, matplotlib dan banyak perpustakaan ilmiah dan pengolahan data yang bermanfaat.

serv-inc
sumber
0

Perhatikan bahwa pada cython 0.29 ada opsi check_size baru yang menghilangkan peringatan di sumbernya, jadi tidak ada solusi yang diperlukan setelah versi meresap ke berbagai paket

mattip
sumber
-3

Lingkungan saya adalah Python 2.7.15

saya coba

pip uninstall
pip install --no-use-wheel

tetapi tidak berhasil. Ini menunjukkan kesalahan:

tidak ada opsi seperti: --tidak digunakan-roda

Lalu saya mencoba:

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

Dan itu berhasil: peringatan yang tidak berguna tidak muncul.

Dan
sumber
3
Opsi --no-use-wheeltelah dihapus. Gunakan --no-binary :all:sebagai gantinya.
jmlarson
-5

Ketika mengimpor scipy, info kesalahan menunjukkan: RuntimeWarning: builtin .type size berubah, dapat menunjukkan ketidakcocokan biner. Diharapkan zd, dapatkan zd

Saya memecahkan masalah ini dengan memperbarui versi python dari 2.7.2 ke 2.7.13

Hao Xiang
sumber