1、CIFAR-10,是一个用于做图像分类研究的数据集。
- 由60000个图片组成
- 6万个图片中,5万张用于训练,1万张用于测试
- 每个图片是32x32像素
- 所有图片可以分成10类
- 每个图片都有一个标签,标记属于哪一个类
- 测试集中一个类对应1000张图
- 训练集中将5万张图分为5份
- 类之间的图片是互斥的,不存在类别重叠的情况
下图展示了具体的分类,

2、 数据集加载:
CIFAR-10提供了三个版本的数据格式:python,matlab,二进制 。
这里以python的加载为例,参考http://cs231n.github.io/assignments2018/assignment1/
1from __future__ import print_function 2 3from six.moves import cPickle as pickle 4import numpy as np 5import os 6from scipy.misc import imread 7import platform 8 9#读取文件 10def load_pickle(f): 11 version = platform.python_version_tuple() # 取python版本号 12 if version[0] == '2': 13 return pickle.load(f) # pickle.load, 反序列化为python的数据类型 14 elif version[0] == '3': 15 return pickle.load(f, encoding='latin1') 16 raise ValueError("invalid python version: {}".format(version)) 17 18def load_CIFAR_batch(filename): 19 """ load single batch of cifar """ 20 with open(filename, 'rb') as f: 21 datadict = load_pickle(f) # dict类型 22 X = datadict['data'] # X, ndarray, 像素值 23 Y = datadict['labels'] # Y, list, 标签, 分类 24 25 # reshape, 一维数组转为矩阵10000行3列。每个entries是32x32 26 # transpose,转置 27 # astype,复制,同时指定类型 28 X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float") 29 Y = np.array(Y) 30 return X, Y 31 32def load_CIFAR10(ROOT): 33 """ load all of cifar """ 34 xs = [] # list 35 ys = [] 36 37 # 训练集batch 1~5 38 for b in range(1,6): 39 f = os.path.join(ROOT, 'data_batch_%d' % (b, )) 40 X, Y = load_CIFAR_batch(f) 41 xs.append(X) # 在list尾部添加对象X, x = [..., [X]] 42 ys.append(Y) 43 Xtr = np.concatenate(xs) # [ndarray, ndarray] 合并为一个ndarray 44 Ytr = np.concatenate(ys) 45 del X, Y 46 47 # 测试集 48 Xte, Yte = load_CIFAR_batch(os.path.join(ROOT, 'test_batch')) 49 return Xtr, Ytr, Xte, Yte
batch数据反序列化出来是
{
'data': 像素数据,
'labels':分类标签
}
其中涉及到的python基础:
1、from __future__ import print_function, __future__是用于在老版本python中使用新版本特性
2、from six.moves import cPickle as pickle, 是序列化和反序列化库,pickle.load,反序列化为python的数据类型
3、list的append方法,在list尾部添加对象,不需要和之前的数据类型一致
4、numpy的concatenate,合并array
Reference: