一、CIFAR-10
CIFAR-10数据集由10类32*32的彩色图片组成, 一共包含60000张图片,每一类包含6000张图片。 其中50000张图片作为训练集, 10000张图片作为测试集。
CIFAR-10数据集被划分成了5个训练的batch和1个测试的batch, 每个batch均包含10000张图片。测试集batch的图片是从每个类别中随机挑选的1000张图片组成的, 训练集batch以随机的顺序包含剩下的50000张图片。 不过一些训练集的batch可能包含某一类图片比其他类的图片数量多的情况。 训练集batch包含来自每一类的5000张图片, 一共50000张训练图片。
下图显示的是数据集的类, 以及每一类中随机挑选的10张图片:
二、CIFAR-10数据集解析
官方给了多个CIFAR-10数据集的版本, 一下是链接:
Version | Size | md5sum |
---|---|---|
CIFAR-10 python version | 163MB | c58f30108f718f92721af3b95e74349a |
CIFAR-10 Matlabversion | 175MB | 70270af85842c9e89bb428ec9976c926 |
CIFAR-10 binaryversion | 162MB | c32a1d4ab5d03f1284b67883e8d87530 |
此处我们只放入python下载的链接。
名称 | 作用 |
---|---|
data_batch_1 | 训练接的第一个batch, 含有10000张图片 |
data_batch_2 | 训练接的第二个batch, 含有10000张图片 |
data_batch_3 | 训练接的第三个batch, 含有10000张图片 |
data_batch_4 | 训练接的第四个batch, 含有10000张图片 |
data_batch_5 | 训练接的第五个batch, 含有10000张图片 |
test_batch | 测试集的batch, 含有10000张图片 |
上述文件结构中, 每一batch文件包含一个python的字典(dict)结构, 结构如下
名称 | 作用 |
---|---|
‘data’ | 是一个100003072的array,每一行的元素组成了一个3232的3通道图片, 共10000张 |
‘labels’ | 是一个长度为10000的list, 对应包含data中每一张图片的label |
‘batch_label’ | 这一份batch的名称 |
‘filenames’ | 一个长度为10000的list, 对应包含data中的每一张图片的名称 |
真正重要的就是两个关键字是data和labels, 剩余的两个并不是十分重要。
以下部分就是跟下面参考博客的博主不同了, 下面博主是直接用框架加载数据集,像这种直接用框架加载数据集的博客很多,但往往我们自己做实验的时候,都是自定义的数据集,那该怎么加载自己的数据呢, 这里我会做出详细的步骤, 以及这篇博客所需要的的代码, 本人小菜一枚,在坑中挣扎多日,希望大家少入点坑,欢迎大家指正,小菜虚心接受。
先把CIFAR-10数据集根据分类我们转换成50000张训练集的图片和10000张测试集的图片
CIFAR-10训练集转换成图片代码:
"""
解压缩,返回解压后的字典, 将file中的对象序列化读出
"""
def unpickle(file):
fo = open(file, 'rb')
dict = pickle.load(fo, encoding='latin1')
fo.close()
return dict
"""
生成训练集图片,如果需要png格式,只需要改图片后缀名即可。
"""
for j in range(1, 6):
"""
读取当前目录下的data_batch12345文件,dataName其实也是data_batch文件的路径,本文和脚本文件在同一目录下。
"""
dataName = "C:\\Code\\Code_Python\\CIFAR10\\data\\data_batch_" + str(j)
Xtr = unpickle(dataName)
print(dataName + " is loading...")
for i in range(0, 10000):
"""
Xtr['data']为图片二进制数据
"""
img = np.reshape(Xtr['data'][i], (3, 32, 32))
"""
读取image
"""
img = img.transpose(1, 2, 0)
"""
Xtr['labels']为图片的标签,值范围0-9,本文中,train文件夹需要存在,并与脚本文件在同一目录下。
"""
picName = 'C:/Code/Code_Python/CIFAR10/data/train/' + str(Xtr['labels'][i]) + '_' + str(i + (j - 1)*10000) + '.jpg'
plt.imsave(picName, img)
print(dataName + " loaded.")
CIFAR-10测试集转换C成图片代码:
"""
解压缩,返回解压后的字典, 将file中的对象序列化读出
"""
def unpickle(file):
fo = open(file, 'rb')
dict = pickle.load(fo, encoding='latin1')
fo.close()
return dict
"""
生成测试集图片
"""
testXtr = unpickle("/CIFAR10\\data\\test_batch")
print(testXtr.keys())
for i in range(0, 10000):
"""
reshape()函数的作用是安装3*32*32 【c,h,w 】的矩阵样式重新组织
"""
img = np.reshape(testXtr['data'][i], (3, 32, 32))
"""
matplotlib的图片生成格式是 【h, w, c】这样的
所以要转置一下矩阵
"""
img = img.transpose(1, 2, 0)
"""
拼接图片路径
"""
picName = 'C:/Code/Code_Python/CIFAR10/data/test/' + str(testXtr['labels'][i]) + '_' + str(i) + '.jpg'
"""
保存
"""
plt.imsave(picName, img)
print("test_batch loaded.")
结果如下:
今天就写在这里 明天接着在写 哈哈哈哈。。。。。
参考:
Tensorflow深度学习之二十:CIFAR-10数据集介绍
Python数据存储:pickle模块的使用讲解