पायथन 2 और 3 के बीच सुन्न सरणियों का अचार असंगतता


163

मैं इस कार्यक्रम का उपयोग करके पायथन 3.2 में यहां जुड़े MNIST डेटासेट को लोड करने की कोशिश कर रहा हूं :

import pickle
import gzip
import numpy


with gzip.open('mnist.pkl.gz', 'rb') as f:
    l = list(pickle.load(f))
    print(l)

दुर्भाग्य से, यह मुझे त्रुटि देता है:

Traceback (most recent call last):
   File "mnist.py", line 7, in <module>
     train_set, valid_set, test_set = pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)

मैंने तब पायथन 2.7 में पिक फ़ाइल को डिकोड करने की कोशिश की, और इसे फिर से एनकोड किया। इसलिए, मैंने पायथन 2.7 में इस कार्यक्रम को चलाया:

import pickle
import gzip
import numpy


with gzip.open('mnist.pkl.gz', 'rb') as f:
    train_set, valid_set, test_set = pickle.load(f)

    # Printing out the three objects reveals that they are
    # all pairs containing numpy arrays.

    with gzip.open('mnistx.pkl.gz', 'wb') as g:
        pickle.dump(
            (train_set, valid_set, test_set),
            g,
            protocol=2)  # I also tried protocol 0.

यह त्रुटि के बिना चला, इसलिए मैंने पायथन 3.2 में इस कार्यक्रम को फिर से चलाया:

import pickle
import gzip
import numpy

# note the filename change
with gzip.open('mnistx.pkl.gz', 'rb') as f:
    l = list(pickle.load(f))
    print(l)

हालाँकि, इसने मुझे पहले की तरह ही त्रुटि दी। मैं इससे कैसे काम लूं?


MNIST डेटासेट लोड करने के लिए यह एक बेहतर तरीका है।


2.7 और 3.x के बीच संगतता विराम हैं। विशेष रूप से स्ट्रिंग बनाम यूनिकोड। और एक numpy ऑब्जेक्ट को चुनने के लिए आवश्यक है कि दोनों सिस्टम numpy मॉड्यूल को लोड करें लेकिन वे मॉड्यूल अलग-अलग हैं। क्षमा करें, मेरे पास कोई उत्तर नहीं है, लेकिन यह संभव नहीं है और शायद यह उचित नहीं है। अगर यह बड़ी चीजें हैं (gzip), शायद pfables के साथ hdf5 ??
फिल कूपर

@PhilCooper: धन्यवाद, आपकी टिप्पणी (इसे उत्तर के रूप में पोस्ट करें?) ने मुझे सही उत्तर में ला दिया। मैं hdf5 का उपयोग कर सकता था, लेकिन यह सीखने के लिए जटिल लग रहा था, इसलिए मैं numpy.save/load के साथ गया और यह काम किया।
नील जी

h5py उपयोग करने के लिए बहुत सरल है, लगभग निश्चित रूप से बहुत आसान है तो सुन्न सरणियों को चुनने के साथ तंत्रिका अनुकूलता समस्याओं को हल करना।
डेवप

आप कहते हैं कि आपने "पायथन 2.7 के तहत इस कार्यक्रम को चलाया"। ठीक है, लेकिन आपने 3.2 के तहत क्या चलाया? :-) जो उसी?
लेन्आर्ट रेगेब्र जूल

@LennartRegebro: एरे को अचार करने वाले दूसरे प्रोग्राम को चलाने के बाद, मैंने पायथन 3.2 में पहला प्रोग्राम (फ़ाइल नाम mnistx.pkl.gz को प्रतिस्थापित करते हुए) चलाया। यह काम नहीं किया, जो मुझे लगता है कि किसी प्रकार की असंगति को दर्शाता है।
नील जी

जवाबों:


141

ऐसा लगता है कि किसी प्रकार की असंगति है। यह "binstring" ऑब्जेक्ट को लोड करने का प्रयास कर रहा है, जिसे ASCII माना जाता है, जबकि इस मामले में यह बाइनरी डेटा है। यदि यह पायथन 3 अनपिकलर में एक बग है, या खस्ता द्वारा पिकर का "दुरुपयोग" है, तो मुझे नहीं पता।

यहाँ कुछ हल है, लेकिन मुझे नहीं पता कि इस बिंदु पर डेटा कितना सार्थक है:

import pickle
import gzip
import numpy

with open('mnist.pkl', 'rb') as f:
    u = pickle._Unpickler(f)
    u.encoding = 'latin1'
    p = u.load()
    print(p)

इसे पायथन 2 में अनप्लिक करना और फिर इसे फिर से जोड़ना केवल एक ही समस्या पैदा करना है, इसलिए आपको इसे दूसरे प्रारूप में सहेजने की आवश्यकता है।


211
आप pickle.load(file_obj, encoding='latin1')(कम से कम पायथन 3.3 में) का उपयोग कर सकते हैं । यह काम करने लगता है।
टॉम एल्ड्रॉफ्ट

7
उन लोगों के लिए जो संख्यात्मक भार का उपयोग कर रहे हैं और इसी तरह की समस्या का सामना कर रहे हैं: वहां भी एन्कोडिंग को पारित करना संभव है:np.load('./bvlc_alexnet.npy', encoding='latin1')
सर्ज जहरचेंको सेप

यह मेरे लिए काम किया जब जोड़ने में encoding='latin1'विफल रहा। धन्यवाद!
गुइलेम कुकुरल

130

यदि आपको python3 में यह त्रुटि मिल रही है, तो, यह अजगर 2 और अजगर 3 के बीच एक असंगतता हो सकती है, मेरे लिए समाधान एन्कोडिंग के loadसाथ था latin1:

pickle.load(file, encoding='latin1')

16

यह Python 2 और Python 3 के बीच असंगतता प्रतीत होती है। मैंने MNIST डेटासेट लोड करने की कोशिश की

    train_set, valid_set, test_set = pickle.load(file, encoding='iso-8859-1')

और इसने पायथन 3.5.2 के लिए काम किया


7

ऐसा लगता है कि यूनीकोड ​​की चाल के कारण 2.x और 3.x के बीच अचार में कुछ हमदर्दी के मुद्दे हैं। आपकी फ़ाइल अजगर 2.x के साथ ली गई प्रतीत होती है और इसे 3.x में डिकोड करना परेशानी भरा हो सकता है।

मैं अजगर 2.x के साथ इसे अनप्लिक करने का सुझाव देता हूं और आपके द्वारा उपयोग किए जा रहे दो संस्करणों में अधिक अच्छी तरह से खेलने वाले प्रारूप में सहेजता हूं।


2
यही मैं करने की कोशिश कर रहा था। आप किस प्रारूप की सलाह देते हैं?
नील जी

5
मुझे लगता है कि समस्या स्तब्ध dtype एन्कोडिंग रही होगी, जो एक स्ट्रिंग हो सकती है। किसी भी मामले में, मैंने अजगर 2 और 3 के बीच की खाई को पाटने के लिए numpy.save/load का उपयोग किया, और यह काम कर गया।
नील जी

7

मैं बस इस स्निपेट पर ठोकर खाई। उम्मीद है कि यह संगतता समस्या को स्पष्ट करने में मदद करता है।

import sys

with gzip.open('mnist.pkl.gz', 'rb') as f:
    if sys.version_info.major > 2:
        train_set, valid_set, test_set = pickle.load(f, encoding='latin1')
    else:
        train_set, valid_set, test_set = pickle.load(f)

अधिक प्रवर्धित जानकारी जोड़ने पर विचार करें। यह समस्या को कैसे हल करता है?
टॉम अरांडा

@ जोर से मदद मिली, कृपया उत्तर के बारे में बताएं
सारथ सदाशिवन पिल्लई

6

प्रयत्न:

l = list(pickle.load(f, encoding='bytes')) #if you are loading image data or 
l = list(pickle.load(f, encoding='latin1')) #if you are loading text data

pickle.loadविधि के प्रलेखन से :

वैकल्पिक कीवर्ड तर्क fix_imports, एन्कोडिंग और त्रुटियां हैं, जिनका उपयोग पायथन 2 द्वारा उत्पन्न अचार स्ट्रीम के लिए संगतता समर्थन को नियंत्रित करने के लिए किया जाता है।

यदि fix_imports True है, तो अचार पुराने पायथन 2 नामों को पायथन 3 में उपयोग किए गए नए नामों से मैप करने का प्रयास करेगा।

एन्कोडिंग और त्रुटियां अचार को बताती हैं कि पायथन 2 द्वारा उठाए गए 8-बिट स्ट्रिंग इंस्टेंस को कैसे डीकोड किया जाए; क्रमशः 'ASCII' और 'सख्त' के लिए ये डिफ़ॉल्ट हैं। इन 8-बिट स्ट्रिंग इंस्टेंस को बाइट ऑब्जेक्ट के रूप में पढ़ने के लिए एन्कोडिंग 'बाइट्स' हो सकता है।


0

इसमें अचार होता है जो अचार की तुलना में तेज़ और आसान होता है। मैंने अचार डंप में इसे बचाने और पढ़ने की कोशिश की, लेकिन पढ़ते समय बहुत सारी समस्याएं थीं और एक घंटा बर्बाद हो गया और अभी भी एक समाधान नहीं मिला, हालांकि मैं एक चैटबॉट बनाने के लिए अपने स्वयं के डेटा पर काम कर रहा था।

vec_xऔर vec_yसुन्न सरणियाँ हैं:

data=[vec_x,vec_y]
hkl.dump( data, 'new_data_file.hkl' )

तब आप इसे पढ़ते हैं और संचालन करते हैं:

data2 = hkl.load( 'new_data_file.hkl' )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.