Как исправить 'Объектные массивы не могут быть загружены, когда allow_pickle = False' для функции imdb.load_data ()? - PullRequest
42 голосов
/ 28 апреля 2019

Я пытаюсь реализовать пример двоичной классификации, используя набор данных IMDb в Google Colab .Я реализовал эту модель раньше.Но когда я попытался сделать это снова через несколько дней, он вернул ошибку значения: «Объектные массивы не могут быть загружены, когда allow_pickle = False» для функции load_data ().

Я уже пытался решить эту проблему,ссылаясь на существующий ответ для аналогичной проблемы: Как исправить 'Объектные массивы не могут быть загружены, когда allow_pickle = False' в алгоритме sketch_rnn Но оказывается, что простого добавления аргумента allow_pickle недостаточно.

Мой код:

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

Ответы [ 9 ]

53 голосов
/ 29 апреля 2019

Эта проблема до сих пор не решена. Я надеюсь, что это будет решено как можно скорее. А пока попробуйте понизить версию до 1.16.2. Похоже, решить проблему.

!pip install numpy==1.16.1
import numpy as np

Эта версия numpy имеет значение по умолчанию allow_pickle как True.

27 голосов
/ 21 мая 2019

Вот трюк, чтобы заставить imdb.load_data разрешить засолку в вашей записной книжке, заменив эту строку:

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

этим:

# 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
21 голосов
/ 09 мая 2019

После этой проблемы на GitHub официальное решение - отредактировать файл imdb.py. Это исправление работало хорошо для меня без необходимости понижать версию numpy. Найдите файл imdb.py в tensorflow/python/keras/datasets/imdb.py (полный путь для меня был: C:\Anaconda\Lib\site-packages\tensorflow\python\keras\datasets\imdb.py - другие установки будут другими) и измените строку 85 согласно diff:

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

Причиной изменения является безопасность для предотвращения Python-эквивалента SQL-инъекции в маринованном файле. Вышеуказанное изменение повлияет ТОЛЬКО на данные IMDB, и поэтому вы сохраняете безопасность в другом месте (не понижая NumPy).

9 голосов
/ 15 мая 2019

Я просто использовал allow_pickle = True в качестве аргумента для np.load (), и это сработало для меня.

6 голосов
/ 24 мая 2019

Я думаю, что ответ от cheez (https://stackoverflow.com/users/122933/cheez) - самый простой и эффективный. Я бы немного уточнил его, чтобы он не изменял функцию numpy за весь период сеанса.

Мое предложение ниже. Я использую его для загрузки набора данных Reuters из Keras, который показывает такую ​​же ошибку:

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)
3 голосов
/ 02 июня 2019

Вы можете попробовать изменить значение флага

np.load(training_image_names_array,allow_pickle=True)
2 голосов
/ 02 мая 2019

Да, установка предыдущей версии numpy решила проблему.

Для тех, кто использует PyCharm IDE:

в моей IDE (Pycharm), File-> Settings-> Project Interpreter: я обнаружил, что мой numpy равен 1.16.3, поэтому я возвращаюсь назад к1.16.1.Нажмите + и введите numpy в поиске, отметьте «указать версию»: 1.16.1 и выберите -> установить пакет.

0 голосов
/ 24 июня 2019

найдите путь к imdb.py, затем просто добавьте флаг в np.load (путь, ... флаг ...)

    def load_data(.......):
    .......................................
    .......................................
    - with np.load(path) as f:
    + with np.load(path,allow_pickle=True) as f:
0 голосов
/ 12 мая 2019

В Tensorflow исправлено в ночной версии.

!pip install tf-nightly

Текущая версия - 2.0.0-dev20190511.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...