深度学习之MNIST数据集识别(四)

作者: Lee_5566 | 来源:发表于2018-09-11 17:25 被阅读5次

MNIST

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.

MNIST数据库的文件格式

数据以非常简单的文件格式存储,用于存储矢量和多维矩阵。
文件中的所有整数都以大多数非英特尔处理器使用的MSB优先(高端)格式存储。英特尔处理器和其他低端机器的用户必须翻转标头的字节。

有4个文件:

train-images-idx3-ubyte:training set images
train-labels-idx1-ubyte:training set labels
t10k-images-idx3-ubyte:test set images
t10k-labels-idx1-ubyte:test set labels

训练集包含60000个示例,测试集包含10000个示例。

测试集的前5000个示例取自原始NIST训练集。最后的5000个来自原始的NIST测试集。第一个5000比过去5000更干净,更容易。

TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 60000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
The labels values are 0 to 9.

TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

TEST SET LABEL FILE (t10k-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 10000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
The labels values are 0 to 9.

TEST SET IMAGE FILE (t10k-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 10000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

所以对于训练集(train-images-idx3-ubyte:training set images )数据的偏移量从offset 0016开始。而标签集(train-labels-idx1-ubyte)数据的偏移量是从offset 0008开始的。

将读取的数据转化成数字保存到列表中,然后使用matplotlib输出一下效果。

代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import struct
from bp import *
from datetime import datetime
import matplotlib.pyplot as plt

# 数据加载器基类
class Loader(object):
    def __init__(self, path, count):
        '''
        初始化加载器
        path: 数据文件路径
        count: 文件中的样本个数
        '''
        self.path = path
        self.count = count
    def get_file_content(self):
        '''
        读取文件内容
        '''
        f = open(self.path, 'rb')
        content = f.read()
        f.close()
        return content
    def to_int(self, byte):
        '''
        将unsigned byte字符转换为整数
        '''
        return struct.unpack('B', byte)[0]
# 图像数据加载器
class ImageLoader(Loader):
    def get_picture(self, content, index):
        '''
        内部函数,从文件中获取图像
        '''
        ##从偏移量位置开始读取有效数据
        start = index * 28 * 28 + 16

        picture = []
        for i in range(28):
            picture.append([])
            for j in range(28): 
                picture[i].append(
                    self.to_int(content[start + i * 28 + j]))
        #picture 结构 二位数组 28*28
        return picture
    def load_image(self):
        '''
        加载数据文件,获得全部样本的输入向量
        '''
        #读取所有的图片样本
        content = self.get_file_content()
        data_set = []
        for index in range(self.count):
            data_one = [];
            data_one = self.get_picture(content, index);
            data_set.append(data_one);
        #data_set 格式 [[图1][图2]]  图1=[[][][]]=28*28
        return data_set
# 标签数据加载器
class LabelLoader(Loader):
    def load(self):
        '''
        加载数据文件,获得全部样本的标签向量
        '''
        content = self.get_file_content()
        labels = []
        for index in range(self.count):
            labels.append(self.to_int(content[index + 8]));
        return labels

def get_training_image():
    '''
    获得训练数据集
    '''
    image_loader = ImageLoader('train-images.idx3-ubyte', 1000)
    label_loader = LabelLoader('train-labels.idx1-ubyte', 1000)
    return image_loader.load_image(), label_loader.load()

if __name__ == '__main__':
    #获取图片和标识集
    x_train,y_train = get_training_image();
    #构建子图
    fig, ax = plt.subplots(nrows=2,ncols=5,sharex=True,sharey=True,);
    ax = ax.flatten();

    for index in range(10):
        for j in range(len(y_train)):
            if y_train[j] == index:
                img = x_train[j];
                ax[index].imshow(img, cmap='Greys', interpolation='nearest');
                break;

    ax[0].set_xticks([])
    ax[0].set_yticks([])
    plt.tight_layout()
    plt.show()
   

执行结果

参考

零基础入门深度学习(3) - 神经网络和反向传播算法
https://www.zybuluo.com/hanbingtao/note/476663
详解 MNIST 数据集
https://blog.csdn.net/simple_the_best/article/details/75267863

相关文章

  • python处理MNIST数据集

    1. MNIST数据集 1.1 MNIST数据集获取 MNIST数据集是入门机器学习/模式识别的最经典数据集之一。...

  • 深度学习之MNIST数据集识别(四)

    MNIST MNIST 数据集来自美国国家标准与技术研究所, National Institute of Stan...

  • Python深度学习2

    使用keras搭建CNN深度学习网络,使用mnist数据集。 一、导入所需要的包 二、载入数据集 mnist.lo...

  • 姓名:于倩学号:21011210116学院:通信工程学院

    MNIST数据集 MNIST数据集是深度学习领域标准,易用的成熟数据集。 由6万个训练样本和1万个测试样本组成,每...

  • 神经网络实现Mnist手写数字识别

    1.Mnist手写数字识别介绍 Mnist手写数字识别是Kaggle上一个很经典的机器学习数据集,里边包括...

  • Tensorflow基础入门

    MNIST 数据集入门 MNIST 数据集简介 数字手写体识别数据集,常用来作为Deep Learning入门的基...

  • CNN入门项目

    待写。 MNIST手写数字识别 Cifar数据集

  • 2019-11-19

    今天接触深度学习,学习了多层神经网络的实现,完成了一个小小的实战经典的手写数字识别的训练。 数据集:mnist 网...

  • 2018-06-26 利用keras(tensorflow) 做

    利用keras(tensorflow) 做cnn mnist识别 使用Python解析MNIST数据集(IDX文件...

  • 2019-10-14

    深度学习第八天 神经网络实现全过程理论部分介绍: 1.数据输入:以Mnist数据集为例子:Mnist数据集是来自美...

网友评论

    本文标题:深度学习之MNIST数据集识别(四)

    本文链接:https://www.haomeiwen.com/subject/iznwwftx.html