Imdb.load_data () ক্রিয়াকলাপের জন্য પરવાનગી_পিক্লে = মিথ্যা 'কীভাবে' অবজেক্ট অ্যারেগুলি লোড করা যায় না?


113

আমি গুগল কোলাবে আইএমডিবি ডেটাসেট ব্যবহার করে বাইনারি শ্রেণিবদ্ধকরণ উদাহরণটি প্রয়োগ করার চেষ্টা করছি । আমি আগে এই মডেলটি বাস্তবায়ন করেছি। কিন্তু যখন আমি কয়েক দিন পরে আবার এটি করার চেষ্টা করেছি তখন এটি একটি মান ত্রুটি ফিরিয়ে দিয়েছে: 'লোড_ডাটা () ফাংশনের জন্য অনুমতি_পিক্লে = মিথ্যা' যখন অবজেক্ট অ্যারেগুলি লোড করা যায় না।

আমি ইতিমধ্যে একই সমস্যার জন্য একটি বিদ্যমান উত্তর উল্লেখ করে এটি সমাধান করার চেষ্টা করেছি: স্কেচ_আরএনএল অ্যালগরিদমে যখন 'অ্যানাজ_পিক্লে = মিথ্যা' তখন কীভাবে 'অবজেক্ট অ্যারেগুলি লোড করা যায় না তবে দেখা যাচ্ছে যে কেবল একটি অনুমতি_পিকল যুক্তি যুক্ত করা যথেষ্ট নয়।

আমার কোড:

from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

ভূল:

ValueError                                Traceback (most recent call last)
<ipython-input-1-2ab3902db485> in <module>()
      1 from keras.datasets import imdb
----> 2 (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

2 frames
/usr/local/lib/python3.6/dist-packages/keras/datasets/imdb.py in load_data(path, num_words, skip_top, maxlen, seed, start_char, oov_char, index_from, **kwargs)
     57                     file_hash='599dadb1135973df5b59232a0e9a887c')
     58     with np.load(path) as f:
---> 59         x_train, labels_train = f['x_train'], f['y_train']
     60         x_test, labels_test = f['x_test'], f['y_test']
     61 

/usr/local/lib/python3.6/dist-packages/numpy/lib/npyio.py in __getitem__(self, key)
    260                 return format.read_array(bytes,
    261                                          allow_pickle=self.allow_pickle,
--> 262                                          pickle_kwargs=self.pickle_kwargs)
    263             else:
    264                 return self.zip.read(key)

/usr/local/lib/python3.6/dist-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs)
    690         # The array contained Python objects. We need to unpickle the data.
    691         if not allow_pickle:
--> 692             raise ValueError("Object arrays cannot be loaded when "
    693                              "allow_pickle=False")
    694         if pickle_kwargs is None:

ValueError: Object arrays cannot be loaded when allow_pickle=False

1
এই সমস্যার মানে কি?
চার্লি পার্কার

3
@ চর্লিপার্কার স্পষ্টতই নমপি.লোড () ফাংশনে একটি প্যারামিটার যুক্ত হয়েছে। পূর্বে এটি ছিল np.load(path), এখন এটা np.load(path, boolean)ডিফল্টরূপে, বুলিয়ান (allow_pickle) মিথ্যা
কণাদ

ধন্যবাদ! কিন্তু তার মানে কি এই যে নগ্নতা সংরক্ষণের সময় আমার অনুমতি ব্যতীত আমার জন্য জিনিসগুলি বাছাই করে ?! অদ্ভুত! আমি np.savezডক্সের দিকে তাকালাম তবে পিকিংয়ের কোনও রেফারেন্স ছিল না তাই আমি জানি না যে এটি প্রথম স্থানে কীভাবে জানত যে আমি যে জিনিসগুলি সংরক্ষণ করছিলাম সেগুলি ছিল পাইটোরিচ স্টাফগুলি এবং কেবল অদ্ভুত নয় ... অদ্ভুত! আপনি যদি আমাদের সাথে ভাগ করে নেওয়ার বিষয়টি জানেন তবে :)
চার্লি পার্কার

একই সমস্যাটি চালানোর পরে আমার বিশ্বাস হ'ল এটি একটি সম্পূর্ণ নির্ভর করে যা আপনি কোন .npz এ সঞ্চয় করছেন তার উপর। যদি আপনি অন্তর্নির্মিত প্রকারগুলি সংরক্ষণ করেন তবে কোনও পিকিং নেই। যাইহোক, আপনি অজগর / নম্পি কোনও বস্তু লিখলে এটি বাছাই করা হবে (অর্থাত এটি সিরিয়ালাইজ করা হবে)। এটি আমি কল্পনা করি যে এটি একটি সুরক্ষা ঝুঁকিপূর্ণ করে তোলে, তাই নম্পির পরবর্তী সংস্করণগুলি এটিকে ডিফল্ট হতে দেওয়া বন্ধ করে দিয়েছে ... তবে কেবল একটি কুঁচকী।
রবার্ট লাগেজ

উত্তর:


123

imdb.load_dataএই লাইনটি প্রতিস্থাপন করে, আপনার নোটবুকে, আচারের অনুমতি দেওয়ার জন্য এখানে একটি কৌশল :

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

এটা দ্বারা:

import numpy as np
# save np.load
np_load_old = np.load

# modify the default parameters of np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

# call load_data with allow_pickle implicitly set to true
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

# restore np.load for future normal usage
np.load = np_load_old

আমি শুরুতে "এনপি হিসাবে আমদানি নম্পি" যুক্ত করার পরামর্শ দিই। নম্পি অন্য নামে আমদানি করা হতে পারে, বা মোটেও আমদানি করা যায় না ...
ক্রিস্টফ

এটি আমাকে অনেক সাহায্য করে
স্থিতিশীল

7
ত্রুটি TypeError: <lambda>() got multiple values for keyword argument 'allow_pickle'
হায়াত


91

এই সমস্যাটি এখনও কেরাস গিটে চলছে। আমি আশা করি এটি যত তাড়াতাড়ি সম্ভব সমাধান হয়ে যাবে। ততক্ষণে আপনার অদ্ভুত সংস্করণটি 1.16.2 এ ডাউনগ্রেড করার চেষ্টা করুন। এটি সমস্যার সমাধান বলে মনে হচ্ছে।

!pip install numpy==1.16.1
import numpy as np

Numpy এই সংস্করণটি ডিফল্ট মান আছে allow_pickleহিসাবে True


4
আমি ম্যাপ্পাগনোসিস থেকে সমাধানটি নিম্পি সংস্করণটি ডাউনগ্রেডের পরিবর্তে ব্যবহার করব: আমার জন্য সংস্করণ নাচের সাথে চারপাশে ফিউজিং একটি শেষ অবলম্বন!
এরিক

2
1.16.4 এও সমস্যাটি রয়েছে
কেনসাই

ধন্যবাদ @ কেনসাই। কেউ কি জানেন যে এটি নকল 1.17 এ সমাধান হয়ে গেছে কিনা?
nsheff

নকল 1.18 এ এখনও এই সমস্যাটি উপস্থিত রয়েছে। আমাকে নম্পি 1.16.1 এ স্যুইচ করতে হয়েছিল এবং এটি এখনই সমাধান হয়ে গেছে। ধন্যবাদ.
বিসি স্মিথ

55

গিটহাব-এ এই সমস্যাটি অনুসরণ করার পরে , অফিশিয়াল সমাধান হ'ল imdb.py ফাইলটি সম্পাদনা করা। এই ফিক্সটি নিম্পিকে ডাউনগ্রেডের প্রয়োজন ছাড়াই আমার পক্ষে ভাল কাজ করেছে। এখানে imdb.py ফাইলটি সন্ধান করুন tensorflow/python/keras/datasets/imdb.py(আমার জন্য পুরো পথটি ছিল: C:\Anaconda\Lib\site-packages\tensorflow\python\keras\datasets\imdb.py- অন্যান্য ইনস্টলগুলি পৃথক হবে) এবং পার্থক্য অনুসারে 85 লাইন পরিবর্তন করুন:

-  with np.load(path) as f:
+  with np.load(path, allow_pickle=True) as f:

পরিবর্তনের কারণটি হল একটি পিকলড ফাইলে একটি এসকিউএল ইঞ্জেকশনের পাইথন সমতুল্য প্রতিরোধ সুরক্ষা। উপরের পরিবর্তনটি কেবলমাত্র imdb ডেটাকেই প্রভাবিত করবে এবং সুতরাং আপনি অন্য কোথাও সুরক্ষা বজায় রাখবেন (নম্পিকে ডাউনগ্রেড না করে)।


1
যেমনটি আমি বলেছিলাম, আমি কলাব ব্যবহার করছি, আমি কীভাবে imdb.py ফাইলটিতে পরিবর্তন করতে পারি?
কানাদ

এটি কোনও কলাব সমস্যা নয় কারণ আপনি প্রথমবার এটি উল্লেখ করার পরে আইএমডিবি স্থানীয়ভাবে ডাউনলোড হয়। সুতরাং, আপনার কম্পিউটারে কোথাও একটি স্থানীয় অনুলিপি থাকবে (উপরে প্রস্তাবিত পাথগুলি চেষ্টা করুন - অথবা আপনি যদি কুলাবের জন্য একটি ডিরেক্টরি স্থাপন করেন তবে প্রথমে চেষ্টা করুন) এবং কেবল কোনও আইডিই বা এমনকি কোনও পাঠ্য সম্পাদক এ imdb.py ফাইলটি খুলুন পরিবর্তনটি করুন (আমি জ্যুপিতে কাজ করার সময় ডাউনলোড করা imdb.py ফাইল সম্পাদনা করার জন্য নোটপ্যাড ++ ব্যবহার করেছি - তাই কোলাবের সাথে খুব অনুরূপ পরিবেশ!)।
ম্যাপ্পাগনোসিস

আমার জন্য যে সমাধানটি কাজ করে তা হ'ল এনপি.লোড (ডেটা_পথ, এনকোডিং = 'ল্যাটিন 1', অনুমতি_পিক্লে = সত্য)
জর্জি

আমি যে সমাধানটি ব্যবহার করি তা হ'ল গ্রহণযোগ্য উত্তরের মতো সংস্করণগুলি (বিশেষত নাম্পের) সাথে জগাখিচু করা, যা আমি এড়াতে চাইছি। এটি আরও পাইথোনিক কারণ এটি স্পষ্টভাবে সমস্যার সমাধান করে। (গিথুবে কেরাসের নবীনতম সংস্করণগুলিও নোট করুন, আসলে এই ফিক্সটি অন্তর্ভুক্ত করুন)
এরিক

35

আমি মাত্র অনুমতি_পিক্লে = এনপি.লোড () এর আর্গুমেন্ট হিসাবে সত্য ব্যবহার করেছি এবং এটি আমার পক্ষে কাজ করেছে।


আমি পর্যবেক্ষণ করছি যে আচারের ফলে অ্যারে পরিবর্তন হয়। Np.array_equal ব্যবহার করে সাম্যতার জন্য দৃ
sert

18

আমার ক্ষেত্রে কাজ করেছেন:

np.load(path, allow_pickle=True)

12

আমি মনে করি চিজের উত্তর ( https://stackoverflow.com/users/122933/cheez ) সবচেয়ে সহজ এবং কার্যকর। আমি এটির উপরে কিছুটা বিশদভাবে জানাতে চাই যাতে এটি পুরো সেশনের সময়কালের জন্য কোনও অদ্ভুত ক্রিয়াকে সংশোধন না করে।

আমার পরামর্শ নীচে। আমি কেরাস থেকে রয়টার্স ডেটাসেটটি ডাউনলোড করতে এটি ব্যবহার করছি যা একই ধরণের ত্রুটি দেখাচ্ছে:

old = np.load
np.load = lambda *a,**k: old(*a,**k,allow_pickle=True)

from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)

np.load = old
del(old)

আপনি এখানে কি ঘটছে তার আরও ব্যাখ্যা করতে পারেন?
কানাদ

1
আমি কেরাস ডেটাসেটগুলি লোড করতে সক্ষম হচ্ছিলাম না। আমি ইন্টারনেট অনুসন্ধান করেছি এবং একটি সমাধান পেয়েছি যা বলেছিল যে আমার ডি imdb.py ফাইলটি সম্পাদনা করা উচিত, অন্যরা ন্যম্পি ইনস্টলেশনতে (যেমন এখানে) পরিবর্তনগুলি বা টেনসরফ্লোকে একটি বিকাশ সংস্করণে পরিবর্তন করার দিকে ইঙ্গিত করেছিল। আমি এসেছি চিজের সলিউশনটি। আইএমএইচও এটি ছিল সবচেয়ে সহজ এবং কার্যকর।
গুস্তাভো মীরাপালহেটা

1
@ কানাদ - ল্যাম্বদা একটি বেনামে কাজ। গুস্তাভো এনপি.লোডে ফাংশন-অগমেন্ট তৈরি করেছে, অগমেন্টেড সংস্করণ ব্যবহার করেছে, তারপরে ডিফল্ট মানটিতে ফিরে আসবে।
এংগ্রস্টুডেন্ট


4

উপরের তালিকাবদ্ধ সমাধানগুলির মধ্যে আমার পক্ষে কোনও কাজ হয়নি: আমি অজগর ৩.7.৩ দিয়ে অ্যানাকোন্ডা চালাই। আমার জন্য যা কাজ ছিল তা ছিল

  • অ্যানাকোন্ডা পাওয়ারশেল থেকে "কনডা ইনস্টল নিমপি == 1.16.1" চালান

  • বন্ধ করুন এবং নোটবুকটি আবার খুলুন


ধন্যবাদ, আমি এটিই অনুসন্ধান করেছি। যাইহোক, দেখে মনে হচ্ছে 1.16.2 হল নতুন সংস্করণ যেখানে allow_pickle=Trueডিফল্ট মান।
মাতেজ রায়সিনস্কি

3

Jupyter নোটবুক ব্যবহার করে

np_load_old = np.load

# modify the default parameters of np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

ঠিকঠাক কাজ করেছে, তবে আপনি স্পাইডারে এই পদ্ধতিটি ব্যবহার করার সময় সমস্যাটি উপস্থিত হয় (আপনাকে প্রতিবার কার্নেলটি পুনরায় চালু করতে হবে অথবা আপনি একটি ত্রুটি পাবেন:

প্রকারের ত্রুটি: () কীওয়ার্ড আর্গুমেন্ট 'অনুমতি_পিকল' এর জন্য একাধিক মান পেয়েছে

আমি সমাধানটি এখানে ব্যবহার করে সমাধান করেছি :


3

আমি এখানে অবতরণ করেছি, আপনার উপায় চেষ্টা করেছিলাম এবং বের করতে পারি না।

আমি আসলে একটি প্রিজিভেন কোড যেখানে কাজ করছিলাম

pickle.load(path)

ব্যবহৃত হয়েছিল তাই আমি এটির সাথে প্রতিস্থাপন করেছি

np.load(path, allow_pickle=True)

2

হ্যাঁ, নিম্পির আগের সংস্করণটি ইনস্টল করা সমস্যার সমাধান করেছে।

যারা পাইচার্ম আইডিই ব্যবহার করেন তাদের জন্য:

আমার আইডিই (পাইচার্ম) এ, ফাইল-> সেটিংস-> প্রকল্প দোভাষী: আমি আমার আঙ্গুলটি ১.১16.৩ বলে খুঁজে পেয়েছি, তাই আমি ফিরে ফিরে ১.১16.১ এ ফিরে এসেছি। অনুসন্ধানে + ক্লিক করুন এবং নাম্পি টাইপ করুন, "নির্দিষ্ট সংস্করণটি" টিক দিন: 1.16.1 এবং -> প্যাকেজ ইনস্টল করুন।


2

imdb.py এর পথটি সন্ধান করুন তারপরে কেবল এনপি.লোডে পতাকা যুক্ত করুন (পথ, ... পতাকা ...)

    def load_data(.......):
    .......................................
    .......................................
    - with np.load(path) as f:
    + with np.load(path,allow_pickle=True) as f:

1

এটা আমার জন্য কাজ

        np_load_old = np.load
        np.load = lambda *a: np_load_old(*a, allow_pickle=True)
        (x_train, y_train), (x_test, y_test) = reuters.load_data(num_words=None, test_split=0.2)
        np.load = np_load_old

4
আপনার সমাধান কেন কাজ করে তা ব্যাখ্যা করার জন্য কিছু প্রসঙ্গ। (পর্যালোচনা থেকে)।
ZF007

1

আমি যা পেয়েছি তা হ'ল টেনসরফ্লো ২.০ (আমি 2.0.0-alpha0 ব্যবহার করছি) নম্পির সর্বশেষ সংস্করণ অর্থাৎ v1.17.0 (এবং সম্ভবত v1.16.5 +) এর সাথে সামঞ্জস্যপূর্ণ নয়। টিএফ 2 আমদানি করার সাথে সাথে এটি ফিউচার ওয়ার্নিংয়ের একটি বিশাল তালিকা ছুঁড়ে দেয় যা দেখতে এরকম কিছু দেখায়:

FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/anaconda3/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/anaconda3/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/anaconda3/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.

কেরাস থেকে imdb ডেটাসেটটি লোড করার চেষ্টা করার পরেও এই অনুমতি_পিকলের ত্রুটির ফলস্বরূপ

আমি নিম্নলিখিত সমাধানটি ব্যবহার করার চেষ্টা করেছি যা ঠিক কাজ করেছে, তবে আমি টিএফ 2 বা tf.keras আমদানি করে এমন প্রতিটি প্রকল্পই করতে হয়েছিল।

np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

আমি খুঁজে পাওয়া সবচেয়ে সহজ সমাধানটি হ'ল হয় বিশ্বব্যাপী নম্পুটি 1.16.1 ইনস্টল করা, বা ভার্চুয়াল পরিবেশে টেনস্রফ্লো এবং ন্যানপির সংগত সংস্করণগুলি ব্যবহার করা।

এই উত্তরের সাথে আমার লক্ষ্যটি উল্লেখ করা হ'ল এটি কেবল imdb.load_data নিয়েই সমস্যা নয়, তবে টিএফ 2 এবং নম্পি সংস্করণগুলির অসঙ্গতি দ্বারা নষ্ট একটি বৃহত্তর সমস্যা এবং এর ফলে অনেকগুলি লুকানো বাগ বা সমস্যা হতে পারে।


0

টেনসরফ্লোতে টিএফ-নাইট সংস্করণে একটি ফিক্স রয়েছে।

!pip install tf-nightly

বর্তমান সংস্করণটি '2.0.0-dev20190511'।


0

@Cheez উত্তর একদা কাজ করে না এবং যাও recursively ফাংশন আবার এবং আবার কল। এই সমস্যাটি সমাধান করার জন্য আপনার কার্যটি গভীরভাবে অনুলিপি করা উচিত। আপনি ফাংশনটি ব্যবহার করে এটি করতে পারেন partial, সুতরাং চূড়ান্ত কোডটি হ'ল:

import numpy as np
from functools import partial

# save np.load
np_load_old = partial(np.load)

# modify the default parameters of np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

# call load_data with allow_pickle implicitly set to true
(train_data, train_labels), (test_data, test_labels) = 
imdb.load_data(num_words=10000)

# restore np.load for future normal usage
np.load = np_load_old

0

আমি সাধারণত এই জিনিসগুলিতে পোস্ট করি না তবে এটি অত্যন্ত বিরক্তিকর ছিল। বিভ্রান্তিটি ঘটেছিল যে কেরাস imdb.pyফাইলগুলির কিছু ইতিমধ্যে আপডেট হয়েছে:

with np.load(path) as f:

সংস্করণে allow_pickle=True। এই পরিবর্তনটি ইতিমধ্যে কার্যকর করা হয়েছে কিনা তা পরীক্ষা করে নিশ্চিত হয়ে নিন imdb.py ফাইল। এটি সমন্বয় করা থাকলে, নিম্নলিখিতটি সূক্ষ্মভাবে কাজ করে:

from keras.datasets import imdb
(train_text, train_labels), (test_text, test_labels) = imdb.load_data(num_words=10000)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.