2022年 11月 9日

python 手动读取cifar10_Python读入CIFAR-10数据库

CIFAR-10数据组成:

训练集和测试集分别有50000和10000张图片,RGB3通道,尺寸32×32,如下为data_batch_1的组成(使用pickle.load函数):

069ae1a8ccde77c2dbe02ff1afffa174.png

可以看到有四部分,清晰明了

对于CIFAR-10数据的读取,函数有两个,如下所示

1 def load_CIFAR_batch(filename):

2 “”” load single batch of cifar “””

3 with open(filename, ‘rb’) as f:

4 datadict = pickle.load(f,encoding=’latin1′)

5 X = datadict[‘data’]

6 Y = datadict[‘labels’]

7 X = X.reshape(10000, 3, 32,32).transpose(0,2,3,1).astype(“float”)

8 Y = np.array(Y)

9 return X, Y

——————————————————————————————————————————————

1 def load_CIFAR10(ROOT):

2 “”” load all of cifar “””

3 xs = []

4 ys = []

5 for b in range(1,6):

6 f = os.path.join(ROOT, ‘data_batch_%d’ % (b, ))

7 X, Y = load_CIFAR_batch(f)

8 xs.append(X)

9 ys.append(Y)

10 Xtr = np.concatenate(xs)#使变成行向量

11 Ytr = np.concatenate(ys)

12 del X, Y

13 Xte, Yte = load_CIFAR_batch(os.path.join(ROOT, ‘test_batch’))

14 return Xtr, Ytr, Xte, Yte

——————————————————————————————————————————————

其中有几个语句要注意一下:

X = X.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype(“float”)

起初,X的size为(10000, 3072(3*32*32))。首先reshape很好理解,最后astype的格式转换也很好理解。

可是为什么要调用transpose,转置轴呢?就我认为只需要把一幅图像转成行向量就可以了。是为了方便检索吗?

xs.append(X)将5个batch整合起来;np.concatenate(xs)使得最终Xtr的尺寸为(50000,32,32,3)

当然还需要一步Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3)使得每一副图像称为一个行向量,最终就有了50000个行向量(Xtr_rows的尺寸为(50000,3072))

——————————————————————————————————————————————

综上,为了方便,难道不应该直接从最开始就不要调用reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype(“float”),直接append再concatenate不就能导出Xtr_rows了吗?

知道的博友可以讨论一下!