解决ValueError:加载含Pickle数据的NumPy文件时allow_pickle=False报错
解决np.load的ValueError: Cannot load file containing pickled data问题
直接修复加载代码
修改odir.py中所有np.load()调用,添加allow_pickle=True参数。你的.npy文件是通过pickle序列化保存的,而NumPy新版本默认禁用pickle加载,必须显式开启才能匹配。
修改后的完整odir.py代码:
import numpy as np def load_data(image_size, index = 0, challenge = 0): """Loads the ODIR dataset. Returns: Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`. """ if index == 0: x_train = np.load('odir_training' + '_' + str(image_size) + '.npy', allow_pickle=True) y_train = np.load('odir_training_labels' + '_' + str(image_size) + '.npy', allow_pickle=True) else: x_train = np.load('odir_training' + '_' + str(image_size) + '_' + str(index) + '.npy', allow_pickle=True) y_train = np.load('odir_training_labels' + '_' + str(image_size) + '_' + str(index) + '.npy', allow_pickle=True) if challenge == 0: x_test = np.load('odir_testing'+'_' + str(image_size)+'.npy', allow_pickle=True) y_test = np.load('odir_testing_labels'+'_' + str(image_size)+'.npy', allow_pickle=True) else: x_test = np.load('odir_testing_challenge'+'_' + str(image_size)+'.npy', allow_pickle=True) y_test = np.load('odir_testing_labels_challenge'+'_' + str(image_size)+'.npy', allow_pickle=True) return (x_train, y_train), (x_test, y_test)
原理说明
- 从NumPy 1.16版本开始,
np.load()的allow_pickle参数默认值改为False,这是出于安全考量,防止加载恶意pickle数据。 - 你的数据集文件保存时使用了pickle序列化(可能是旧版本NumPy默认允许,或者保存时显式设置了
allow_pickle=True),因此加载时必须显式开启该参数才能正常读取。
优化方案(若能控制数据保存流程)
如果你有权限修改数据保存的代码,建议:
- 保存时明确指定
allow_pickle=True(确认数据源安全的前提下):
# 示例保存代码 np.save('odir_training_128.npy', x_train_data, allow_pickle=True)
- 若无需复杂数据类型,尽量改用纯NumPy数组格式保存,避免依赖pickle,后续加载时无需开启该参数,安全性更高。
内容的提问来源于stack exchange,提问作者Sarthak Rane
相关产品推荐
相关产品推荐

