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 build ใหม่บนเวอร์ชัน Python ที่Python 3.6.6 :: Anaconda, Inc.มีเฉพาะrequestsและpandasติดตั้งในสภาพแวดล้อม
safay

ควรได้รับการแก้ไขในขณะนี้ใน cython 0.29 ดังที่แสดงความคิดเห็นด้านล่าง
mattip

คุณต้องติดตั้งgfortranสำหรับ scipy เพื่อคอมไพล์:sudo apt install gfortran
ma3oun

คำตอบ:


145

อ้างอิงจากMAINT: ปิดปาก Cython คำเตือนเกี่ยวกับการเปลี่ยนแปลงขนาด dtype / ufunc - numpy / numpy :

คำเตือนเหล่านี้จะปรากฏให้เห็นเมื่อใดก็ตามที่คุณนำเข้า scipy (หรือแพ็คเกจอื่น) ที่รวบรวมกับผู้ใช้ที่มีอายุมากกว่าที่ติดตั้ง

และการตรวจสอบจะถูกแทรกโดย Cython (จึงมีอยู่ในโมดูลใด ๆ ที่คอมไพล์ด้วย)

เรื่องสั้นสั้น ๆคำเตือนเหล่านี้ควรเป็นพิษเป็นภัยในกรณีเฉพาะของnumpyและข้อความเหล่านี้จะถูกกรองออกตั้งแต่numpy 1.8 (สาขานี้กระทำไป) ในขณะที่จะรวบรวมกับscikit-learn 0.18.1numpy 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และแพคเกจของบุคคลที่สามถูกสร้างขึ้นโดยเจตนากับรุ่นเก่า:

[การสร้างทุกอย่างใหม่เพื่อต่อต้าน numpy ปัจจุบัน] ไม่ใช่ทางออกที่เป็นไปได้และไม่จำเป็นต้องมีแน่นอน Scipy (เป็นแพ็คเกจอื่น ๆ ) เข้ากันได้กับจำนวนของเวอร์ชัน ดังนั้นเมื่อเราแจกจ่ายไบนารีสคิปเปอร์เราจะสร้างพวกมันเทียบกับเวอร์ชั่นที่ได้รับการสนับสนุนต่ำสุด (1.5.1 ณ ตอนนี้) และพวกมันก็ทำงานกับ 1.6.x, 1.7.x และ numpy master ได้เช่นกัน

ความถูกต้องที่แท้จริงนั้นจะใช้สำหรับ Cython เท่านั้นที่จะออกคำเตือนเมื่อขนาดของ dtypes / ufuncs มีการเปลี่ยนแปลงในลักษณะที่ทำลาย ABI และจะเงียบไป

ด้วยเหตุนี้ผู้พัฒนา Cython จึงเห็นด้วยที่จะเชื่อใจทีม numpy ด้วยการรักษาความเข้ากันได้ของไบนารีด้วยมือดังนั้นเราอาจคาดหวังได้ว่าการใช้เวอร์ชันที่มีการเปลี่ยนแปลง ABI จะทำให้เกิดข้อยกเว้นที่ออกแบบมาเป็นพิเศษหรืออื่น ๆ


¹ ที่มีอยู่ก่อนหน้านี้--no-use-wheelตัวเลือกได้ถูกลบออกตั้งแต่pip 10.0.0


1
การเชื่อมโยงหมอ: --no-binary, แทนที่ต่อความต้องการสำหรับไฟล์ที่ต้องการ นอกจากนี้ผมมาที่นี่สำหรับpandasดังนั้นนี่คือที่เกี่ยวข้องปัญหาpandas GitHub
eacousineau

35

มันเป็นปัญหาของรุ่น numpy ใหม่ (1.15.0)

คุณสามารถปรับลดรุ่นจำนวนมากและปัญหานี้จะได้รับการแก้ไข:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

ในที่สุดเวอร์ชั่น 1.15.1 ที่วางตลาดแล้วจึงมีการแก้ไขปัญหาการเตือน

sudo pip install numpy == 1.15.1

มันใช้งานได้ ..


6
โดยไม่ได้ตั้งใจรหัสที่ quiets นั้นเตือนถูกลบระหว่าง 1.14.5 และ 1.15.0 การแก้ไขเป็นส่วนหนึ่งของการปล่อยข้อผิดพลาด 1.15.1 ซึ่งควรจะออกภายในสิ้นเดือนสิงหาคม 2561
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
Sun Bear

8

ถ้าคุณอยู่ในสภาพแวดล้อมที่ใช้งูใหญ่:

conda update --all

2
หรืออัปเดตแค่นัมตี้ที่เหมาะกับฉัน:conda update numpy
Dan King

8

ฉันได้ลองวิธีที่กล่าวข้างต้น แต่ไม่มีอะไรทำงาน แต่ปัญหามันหายไปหลังจากที่ฉันติดตั้งไลบรารีผ่านการติดตั้ง apt

สำหรับ 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 เวอร์ชั่นก็ช่วยแก้ไขปัญหาของฉันเช่นกัน
Menuka Ishan

หากคุณติดตั้งแพคเกจไบนารีรวมทั้งnumpyจากพื้นที่เก็บข้อมูลอย่างเป็นทางการของ distro มากกว่าจาก PyPI numpyแน่นอนพวกเขาทั้งหมดรวบรวมกับเดียวกันกับที่ ข้อเสียคือคุณอาจไม่ได้รับเวอร์ชันล่าสุด
ivan_pozdeev


1

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากแพคเกจที่ติดตั้งได้สร้างรุ่นต่าง ๆ ของจำนวน numpy
เราจำเป็นต้องสร้าง SciPy และ scikit 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 เรียนรู้ ไม่ได้ช่วยฉัน


0

ข้อมูล Meta: วิธีที่แนะนำในการติดตั้ง sklearn

หากคุณมีการติดตั้งแบบ numpy และ scipy อยู่แล้ววิธีที่ง่ายที่สุดในการติดตั้ง scikit-learn คือการใช้งาน pip

pip install -U scikit-learn 

หรือconda:

conda install scikit-learn

[... อย่ารวบรวมจากแหล่งที่มาโดยใช้ pip]

หากคุณไม่ได้มีการติดตั้งหลามกับ numpy และ SciPy เราขอแนะนำในการติดตั้งผ่านทางผู้จัดการแพคเกจของคุณหรือผ่านทางหลามกำ สิ่งเหล่านี้มาพร้อมกับ numpy, scipy, scikit-learning, 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: builtin .type มีการเปลี่ยนแปลงขนาดอาจบ่งบอกถึงความเข้ากันไม่ได้ของไบนารี คาดว่า zd, รับ zd

ฉันแก้ไขปัญหานี้ได้โดยการอัพเดตเวอร์ชั่นหลามจาก 2.7.2 เป็น 2.7.13

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.