工欲善其事必先利其器,然而每次处理数据集总会遇到数据集加载的问题。本文实现了kesci中CIFAR10数据集加载到Tensorflow中。话不多说,文末附代码。
数据集介绍
背景说明
CIFAR-10数据集是由CIFAR(Candian Institute For Advanced Research) 收集整理的一个用于机器学习和图像识别问题的数据集。
这个数据集共有60000张32 * 32的涵盖10个分类的彩色图片。详情链接
如何在线使用数据集
Python用户,创建项目后,输入 !ls ../input/cifar10/
查看数据集路径
R用户,创建项目后,输入 !list.files('../input/cifar10/')
查看数据集路径
数据说明
- 数据集的整体特征
数据集名称 | 数据类型 | 实例数 | 图像宽 | 图像高 | 相关任务 |
---|---|---|---|---|---|
CIFAR10数据集 | 图片数据 | 60,000 | 32 | 32 | 分类任务 |
数据集包含了6个文件,其中5个位训练集文件,1个为测试集文件。
每个文件都是一个由cPickle生成的Python "pickled"对象。
可以使用官方提供的'unpickle()'函数来加载此类文件,函数返回一个字典(dictionary)。
-
文件列表
- 训练集部分: 50,000张图片
- data_batch_1:训练集batch_1,含10000张32 * 32的点阵图
- data_batch_2:训练集batch_2,含10000张32 * 32的点阵图
- data_batch_3:训练集batch_3,含10000张32 * 32的点阵图
- data_batch_4:训练集batch_4,含10000张32 * 32的点阵图
- data_batch_5:训练集batch_5,含10000张32 * 32的点阵图
- 测试集部分:
- test_batch:测试集test_batch,含10000张32 * 32的点阵图
- 类别名字
- batches.meta:包含一个Python字典对象,条目内容如下:
- label_names: 是一个包含10个元素的列表,赋予了类别列表中数字类别真正意义上的名字。比如,
label_names[0] == "airplane"
飞机✈️label_names[1] == "automobile"
汽车🚗label_names[2] == "bird"
鸟🐦label_names[3] == "cat"
猫🐈- 等等。
- label_names: 是一个包含10个元素的列表,赋予了类别列表中数字类别真正意义上的名字。比如,
- batches.meta:包含一个Python字典对象,条目内容如下:
- 训练集部分: 50,000张图片
unpickle()
函数(数据说明中给出一个加载函数unpickle(),这里针对这个函数进行修改
)
def unpickle(file):
import pickle
with open(file, 'rb') as fo:
dict = pickle.load(fo, encoding='bytes')
return dict
-
返回的一个字典包含以下元素:
data
: 一个10000x3072的numpy数组,数据类型为uint8。数组的每一行存储了一个32x32的彩色图片(RGB)。前1024个的条目包含红色(Red)通道的数值,接下来的1024个的条目包含绿色(Green)通道的数值, 最后的1024个的条目包含蓝色(Blue)通道的数值。图像以行为主顺序存储,因此数组的前32个条目是图像第一行的红色通道值。label
: 范围为0-9的10000个数字的列表。索引i处的数字表示数组数据中第i个图像的标签。
最后附上代码:
# 预处理数据
def unpickle(file):
import pickle
with open(file, 'rb') as fo:
dict = pickle.load(fo, encoding='bytes')
return dict
def load_dataset():
train_path = '/home/ATM006/data/cifar10/data_batch_'
train_data = []
train_labels = []
for i in range(1, 6):
train_data_tmp = unpickle(train_path + str(i))[b'data']
for item in train_data_tmp:
train_data.append(item)
train_labels += unpickle(train_path + str(i))[b'labels']
train_set_x_orig = np.array(train_data)
train_set_y_orig = np.array(train_labels)
test_data = unpickle('/home/ATM006/data/cifar10/test_batch')
test_set_x_orig = np.array(test_data[b'data'][:])
test_set_y_orig = np.array(test_data[b'labels'][:])
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))
classes = np.array([0])
return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
# Loading the dataset
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()