在Jupyter Notebook中加载数据集的Python代码。

7 浏览
0 Comments

在Jupyter Notebook中加载数据集的Python代码。

我在Jupyter Notebook的Python中运行了以下代码:\n

#运行一些设置代码
import random
import numpy as np
from cs231n.data_utils import load_CIFAR10
import matplotlib.pyplot as plt
#这是一种魔法,使matplotlib图表显示在笔记本中,而不是在新窗口中。
%matplotlib inline
plt.rcParams ['figure.figsize'] =(10.0, 8.0)#设置默认大小
plt.rcParams ['image.interpolation'] ='nearest'
plt.rcParams ['image.cmap'] ='gray'
#更多的魔术,以便笔记本将重新加载外部Python模块;
#参见http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython
%load_ext autoreload
%autoreload 2

\n然后是以下指令:\n

#加载原始CIFAR-10数据。
cifar10_dir ='cs231n/datasets/cifar-10-batches-py'
X_train,y_train,X_test,y_test = load_CIFAR10(cifar10_dir)
#作为一个合理的检查,我们打印出训练和测试数据的大小。
print('Training data shape:',X_train.shape)
print('Training labels shape:',y_train.shape)
print('Test data shape:',X_test.shape)
print('Test labels shape:',y_test.shape)

\n通过运行第二部分,我得到了以下错误:\n

-------------------------------------------------- -------------------------
UnicodeDecodeError Traceback(最近的调用最后)
中的
1 #加载原始CIFAR-10数据。
2 cifar10_dir ='cs231n/datasets/cifar-10-batches-py'
- > 3 X_train,y_train,X_test,y_test = load_CIFAR10(cifar10_dir)
4
5 #作为一个合理的检查,我们打印出训练和测试数据的大小。
C:\ Users \ lenovo \ assignment1 \ cs231n \ data_utils.py中的load_CIFAR10(ROOT)
20年在1-6个范围内进行
21 f = os.path.join(ROOT,'data_batch%d'%(b,))
---> 22 X,Y = load_CIFAR_batch(f)
23 xs.append(X)
24 ys.append(Y)
C:\ Users \ lenovo \ assignment1 \ cs231n \ data_utils.py中的load_CIFAR_batch(filename)
7个“”“加载cifar的单个批次”“”
8个带有打开(filename,'rb')as f:
----> 9 datadict = pickle.load(f)
10 X = datadict ['data']
11 Y = datadict ['labels']
UnicodeDecodeError:'ascii'编解码器无法解码位置6中的字节0x8b:序数不在范围内(128)

\n如何解决这个错误?我正在使用Annaconda3运行此代码。似乎以上代码已在Annaonda2版本中编写。有什么建议来解决这些错误吗?\n只是为了更多细节:\n我正在尝试解决链接的任务:http://cs231n.github.io/assignments2016/assignment1/\n编辑:\n添加了包含load_CIFAR定义的data_utils.py\n

import _pickle as pickle
import numpy as np
import os
from scipy.misc import imread
def load_CIFAR_batch(filename):
“”“加载单个cifar批次”“”
with open(filename,'rb')as f:
datadict = pickle.load(f)
X = datadict ['data']
Y = datadict ['labels']
X = X.reshape(10000,3,32,32)。转置(0,2,3,1).astype(“float”)
Y = np.array(Y)
返回X,Y
def load_CIFAR10(ROOT):
“”“加载所有cifar”“”
xs = []
ys = []
for b在范围(1,6):
f = os.path.join(ROOT,'data_batch%d'%(b,))
X,Y = load_CIFAR_batch(f)
xs.append(X)
ys.append(Y)
Xtr = np.concatenate(xs)
Ytr = np.concatenate(ys)
del X,Y
Xte,Yte = load_CIFAR_batch(os.path.join(ROOT,'test_batch'))
返回Xtr,Ytr,Xte,Yte

0
0 Comments

问题:在Jupyter Notebook中加载数据集的原因是pickle文件是用Python 2生成的,而Python 2和Python 3的pickle工作方式存在根本的差异。尝试使用latin-1编码加载文件可能会产生一些错误,因为它假设0-255直接映射到字符。二进制模式不接受编码参数。解决方法是在pickle加载时添加编码参数。

在Jupyter Notebook中加载数据集时,可能会遇到问题。这种问题的原因是pickle文件是用Python 2生成的。由于Python 2和Python 3中pickle工作方式存在根本的差异,因此需要采用一种特殊的方法来加载文件。尝试使用latin-1编码来加载文件可能会导致一些问题,因为它假设0-255直接映射到字符。此方法需要进行一些逻辑检查,因为不能保证产生一致的数据。

另外,二进制模式不接受编码参数。因此,需要对pickle加载时的代码进行一些修改,添加编码参数。以下是一个示例的代码修改:

import pickle
# 加载pickle文件时添加编码参数
with open('data.pkl', 'rb') as f:
    data = pickle.load(f, encoding='latin-1')

通过添加编码参数,可以解决加载pickle文件时出现的问题。然而,修改后可能会出现新的错误,例如"UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 6: invalid start "。这可能是因为pickle文件是由不同版本的Python创建的。Python 2和Python 3的pickle工作方式存在差异。如果pickle文件是由不同版本的Python创建的,可能需要进行一些额外的处理。

另一种可能的原因是pickle文件损坏。如果没有其他问题,那么文件可能已损坏。可以尝试使用其他方法或从其他来源获取pickle文件。

解决在Jupyter Notebook中加载数据集的问题,可以尝试以下步骤:

1. 尝试使用latin-1编码来加载pickle文件。

2. 修改pickle加载代码,添加编码参数。

3. 检查pickle文件是否是由不同版本的Python创建的。

4. 确保pickle文件没有损坏。

希望以上解决方法可以帮助你在Jupyter Notebook中成功加载数据集。如果问题仍然存在,可以尝试在相关的讨论平台或社区寻求帮助。

0