实验之LeNet实现(CIFAR-10数据集)

CIFAR-10数据集介绍

一、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张图片:
实验之LeNet实现(CIFAR-10数据集)_第1张图片

二、CIFAR-10数据集解析
官方给了多个CIFAR-10数据集的版本, 一下是链接:

Version Size md5sum
CIFAR-10 python version 163MB c58f30108f718f92721af3b95e74349a
CIFAR-10 Matlabversion 175MB 70270af85842c9e89bb428ec9976c926
CIFAR-10 binaryversion 162MB c32a1d4ab5d03f1284b67883e8d87530

此处我们只放入python下载的链接。

下载完成后接下, 得到如下目录结构的文件夹:
实验之LeNet实现(CIFAR-10数据集)_第2张图片
其中:

名称 作用
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模块的使用讲解

你可能感兴趣的:(深度学习实验案例)