如何在sketch_rnn算法中修复'allow_pickle = False时无法加载对象数组'

Posted

技术标签:

【中文标题】如何在sketch_rnn算法中修复\'allow_pickle = False时无法加载对象数组\'【英文标题】:How to fix 'Object arrays cannot be loaded when allow_pickle=False' in the sketch_rnn algorithm如何在sketch_rnn算法中修复'allow_pickle = False时无法加载对象数组' 【发布时间】:2019-09-13 10:19:55 【问题描述】:

我在我的 jupyter 笔记本上运行 sketch_rnn.ipynb,在加载环境以加载训练数据集时,它返回错误“当 allow_pickle=False 时无法加载对象数组”

这是 google 开发人员在开发 sketch_rnn 算法时已经使用的代码,该算法甚至在 google colab 中运行。过去我自己在 google colab 上运行过它,但似乎没有在我自己的 jupyter notebook 上运行

from magenta.models.sketch_rnn.sketch_rnn_train import *
from magenta.models.sketch_rnn.model import *
from magenta.models.sketch_rnn.utils import *
from magenta.models.sketch_rnn.rnn import * 

model_params.batch_size = 1
eval_model_params = sketch_rnn_model.copy_hparams(model_params)
eval_model_params.use_input_dropout = 0
eval_model_params.use_recurrent_dropout = 0
eval_model_params.use_output_dropout = 0
eval_model_params.is_training = 0
sample_model_params = sketch_rnn_model.copy_hparams(eval_model_params)
sample_model_params.max_seq_len = 1
return [model_params, eval_model_params, sample_model_params]


[train_set, valid_set, test_set, hps_model, eval_hps_model, 
sample_hps_model] = load_env_compatible(data_dir, model_dir)

我希望输出是

INFO:tensorflow:Downloading http://github.com/hardmaru/sketch-rnn- 
datasets/raw/master/aaron_sheep/aaron_sheep.npz
INFO:tensorflow:Loaded 7400/300/300 from aaron_sheep.npz
INFO:tensorflow:Dataset combined: 8000 (7400/300/300), avg len 125
INFO:tensorflow:model_params.max_seq_len 250.
total images <= max_seq_len is 7400
total images <= max_seq_len is 300
total images <= max_seq_len is 300
INFO:tensorflow:normalizing_scale_factor 18.5198.

但它给了我

ValueError: Object arrays cannot be loaded when allow_pickle=False

【问题讨论】:

这里有同样的问题,使用 imdb 文本分类示例。导致他们相信数据集已经结束了。 【参考方案1】:

所以我相信这只是由于 numpy 对 load() 的更改而浮出水面,如果您观察到发生错误的行,它会引用类似

的内容
    with np.load(path) as f:
        x_train, labels_train = f['x_train'], f['y_train']
        x_test, labels_test = f['x_test'], f['y_test']

但是 Keras 源代码,例如这里的第 58 行:https://github.com/keras-team/keras/blob/master/keras/datasets/imdb.py

现在使用

    with np.load(path, allow_pickle=True) as f:
        x_train, labels_train = f['x_train'], f['y_train']
        x_test, labels_test = f['x_test'], f['y_test']

np.load(path) 变为 np.load(path, boolean)

从简要阅读来看,添加pickles 与安全性有关,因为pickles 可以包含在加载某些内容时将运行的任意 Python 代码。 (可能类似于执行 SQL 注入的方式)

使用新参数列表更新 np.load 后,它适用于我的项目

【讨论】:

我试过上面的代码,但它返回 [Errno 22] Invalid argument: 'github.com/hardmaru/sketch-rnn-datasets/raw/master/aaron_sheep.. @DuncanJerry,你能添加完整的错误日志吗?我猜罪魁祸首是load_env_compatible(data_dir, model_dir),其中load_env_compatible 的方法定义调用了需要更新的某种形式的.load()。 ----> 1 with np.load(data_dir, allow_pickle=True) as load_env_compatible: 2 train_set, test_set, valid_set, hps_model, eval_hps_model, sample_hps_model = load_env_compatible(data_dir, model_dir) [Errno 22 ] 无效参数:'github.com/hardmaru/sketch-rnn-datasets/raw/master/aaron_sheep' Numpy 1.16.3 几天前发布。来自发行说明:“函数 np.load() 和 np.lib.format.read_array() 采用 allow_pickle 关键字,现在默认为 False 以响应 CVE-2019-6446 nvd.nist.gov/vuln/detail/CVE-2019-6446>”。降级到 1.16.2 对我有帮助,因为错误发生在某个库的深处。【参考方案2】:

这段代码解决了我这边的问题。

# Downgrate numpy to fix a problem
!pip install numpy==1.16.2
import numpy as np
print(np.__version__)

我只是将 numpy 降级,因为问题是由于一些内部冲突造成的。

【讨论】:

@DuncanJerry 不客气。您可以将其标记为正确答案,以帮助其他人快速找到它。 在 1.16.3 版中更改:默认为 False 以响应 CVE-2019-6446。见:numpy.org/devdocs/reference/generated/…【参考方案3】:

使用 allow_pickle=True 作为 np.load() 的参数之一。

【讨论】:

以上是关于如何在sketch_rnn算法中修复'allow_pickle = False时无法加载对象数组'的主要内容,如果未能解决你的问题,请参考以下文章

如何在小 GUI 中修复“allow_pickle=False 时无法加载对象数组”

如何使用 Fetch 方法在 reactJS 的 post 调用中修复“请求的资源上不存在‘Access-Control-Allow-Origin’标头”

连接到 WebSocket 时如何修复“Access-Control-Allow-Origin”错误?

如何修复 Angular 1 + ajax + CORS 策略上的 No 'Access-Control-Allow-Origin' 标头? [复制]

如何修复“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”

Laravel 修复请求的资源上不存在“Access-Control-Allow-Origin”标头