如何修复imdb.load_data()函数的“ allow_pickle = False时无法加载对象数组”?

Kan*_*nad 72 python numpy keras

我正在尝试使用Google Colab中的IMDb数据集实现二进制分类示例。我以前已经实现了此模型。但是,几天后我再次尝试执行此操作时,它返回一个值错误:对于load_data()函数,当allow_pickle = False时无法加载对象数组。

我已经尝试解决此问题,请参考一个类似问题的现有答案:如何修复sketch_rnn算法中的“当allow_pickle = False时无法加载对象数组”, 但事实证明,仅添加allow_pickle参数是不够的。

我的代码:

from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

che*_*eez 78

这是一个强制imdb.load_data在笔记本中允许泡菜代替此行的技巧:

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
Run Code Online (Sandbox Code Playgroud)

这样:

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
Run Code Online (Sandbox Code Playgroud)

  • 得到错误`TypeError:&lt;lambda&gt;()获得了关键字参数'allow_pickle'的多个值。 (3认同)

Tir*_*tel 71

这个问题仍然存在于keras git上。我希望它能尽快解决。在此之前,请尝试将numpy版本降级为1.16.2。看来解决了问题。

!pip install numpy==1.16.1
import numpy as np
Run Code Online (Sandbox Code Playgroud)

此版本的numpy的默认值为allow_pickleas True

  • 确实,“ pip install numpy == 1.16.2”有效! (4认同)
  • 我将使用MappaGnosis的解决方案,而不是降级numpy版本:对我而言,纠缠于版本舞蹈是不得已的方法! (3认同)
  • 1.16.4也有问题 (2认同)

Map*_*sis 39

在GitHub上发布此问题之后,官方解决方案是编辑imdb.py文件。此修复程序对我来说效果很好,无需降级numpy。在以下位置找到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:
Run Code Online (Sandbox Code Playgroud)

进行更改的原因是为了防止在腌制文件中使用与SQL注入等效的Python。上面的更改仅会影响imdb数据,因此您将安全性保留在其他位置(不降低numpy的级别)。


小智 25

在我的情况下与:

np.load(path, allow_pickle=True)
Run Code Online (Sandbox Code Playgroud)


Mad*_*mik 20

我只是使用allow_pickle = True作为np.load()的参数,它对我有用。


Gus*_*eta 8

我认为,cheez(/sf/users/8605341/)的答案是最简单,最有效的答案。我将对其进行详细说明,以便在整个会话期间都不会修改numpy函数。

我的建议如下。我正在使用它从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)
Run Code Online (Sandbox Code Playgroud)


Bra*_*ale 8

您可以尝试更改标志的值

np.load(training_image_names_array,allow_pickle=True)
Run Code Online (Sandbox Code Playgroud)


far*_*zov 5

上面列出的解决方案都不适合我:我使用 python 3.7.3 运行 anaconda。对我有用的是

  • 从 Anaconda powershell 运行“conda install numpy==1.16.1”

  • 关闭并重新打开笔记本