前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习之MNIST数据集识别(四)

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

作者头像
李小白是一只喵
发布2020-04-24 12:58:04
5870
发布2020-04-24 12:58:04
举报
文章被收录于专栏:算法微时光算法微时光

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输出一下效果。

代码

代码语言:javascript
复制
#!/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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MNIST
  • MNIST数据库的文件格式
  • 代码
  • 执行结果
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档