2018-06-30 详解 MNIST 数据集

详解 MNIST 数据集

代码解释见下面

Label File

先是一个32位的整形 表示的是Magic Number,这是用来标示文件格式的用的。一般默认不变,为2049

第二是图片的的数量

接下去就是一次排列图片的标示Label。

-

Image File

也是Magic Number。同上。保持不变2051.

图片的数量

图片的高

图片的宽

图片的像素点[灰度 256位]。

unpack(fmt, string)       按照给定的格式(fmt)解析字节流string,返回解析出来的tuple

> big-endian standard       按原字节数

见上图:图片宽高分别为28,所以有28*28=784个值

代码:

import os

import struct

import numpy as np

def load_mnist(path, kind='train'):

print("in load_mnist")

"""Load MNIST data from `path`"""  #注释

labels_path = os.path.join(path,'%s-labels.idx1-ubyte'%kind) #路径+train-labels-idx1-ubyte(gz文件)

images_path = os.path.join(path,'%s-images.idx3-ubyte'%kind) #路径+train-labels-idx1-ubyte(gz文件)

with open(labels_path, 'rb') as lbpath: #以二进制格式打开文件train-labels-idx1-ubyte用于只读,lbpath代表此文件对象

#从文件中读8个字节,1-4个字节为magic number,4-8个字节为图片数量,magic和n均为无符号整形     

magic, n = struct.unpack('>II',lbpath.read(8)) #>  big-endian 高字节在高位 II两个无符号整形,每个占4个字节

labels = np.fromfile(lbpath,dtype=np.uint8)

print("labels length=%d"%len(labels))

with open(images_path, 'rb') as imgpath:

#从文件中读16个字节,1-4个字节为magic number,4-8个字节为图片数量,rows为图片的高,cols为图片的宽,magic,num,rows,cols均为无符号整形

magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16))#> big-endian 高字节在高位IIII四个无符号整形,每个占4个字节

#读取图片数据,并转换为 60,000行784列的矩阵,也就是说一行是一张图片

images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)

print("images length=%d"%len(images))

return images, labels

if __name__=='__main__':

images_train,labels_train=load_mnist('', kind='train')  #cd mnist  python load_mnist.py执行当前程序

print("images")

print (images_train)

print("labels")

print (labels_train)

print('Rows: %d, columns: %d' % (images_train.shape[0], images_train.shape[1]))

count = np.zeros(10)

nTrain = len(images_train)

for i in range(nTrain):

label = labels_train[i]

count[label] += 1

filename = './train/' + str(label) + '/' + str(label) + '_' + str(int(count[label])) + '.png'

print(filename)

img = images_train[i].reshape(28,28)

cv2.imwrite(filename, img) #找不到图片?

print(str(int(count[label])))

print("over")

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

走进Sass殿堂

最近在学习sass,从sass新手的角度做一个简单的总结,总结的不对的地方期望各位大大们能多多指点,本文是针对sass3.4做的一个总结~ 一、变量篇 1.1 ...

17310
来自专栏互联网杂技

前端异步代码解决方案实践(二)

早前有针对 Promise 的语法写过博文,不过仅限入门级别,浅尝辄止食而无味。后面一直想写 Promise 实现,碍于理解程度有限,多次下笔未能满意。一拖再拖...

1196
来自专栏编程

更高级的C+,Qt对象模型

今天我们来看看Qt的对象模型,但在讲述之前,先来看看C++对象模型。 1 C++对象模型 学习过C语言的同学都知道,在C语言中,数据和函数是分开的,也就是说,语...

19510
来自专栏数据结构与算法

家谱 要测试数据的在评论里发联系方式

家谱(gen) 时间限制  2S 【问题描述】     现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先。 【输入...

3428
来自专栏章鱼的慢慢技术路

《算法图解》第六章笔记

1425
来自专栏Golang语言社区

Go语言中反射的正确使用

介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

33716
来自专栏Crossin的编程教室

【Python 第60课】 随机数

有些时日没发新课了,今天来说一说python中的random模块。 random模块的作用是产生随机数。之前的小游戏中用到过random中的randint: i...

3358
来自专栏Golang语言社区

Go语言中反射的正确使用

介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

3408
来自专栏CVer

资源 | 十分钟速成Python

Amusi 今天不推论文速递、不推论文精读,不聊知识点。Amusi 知道关注CVer的同学们都是机器学习、深度学习、CV或者NLP方向的研究者,毋庸置疑,Pyt...

813
来自专栏无所事事者爱嘲笑

正则表达式零宽断言详解(?=,?<=,?!,?<!)

1575

扫码关注云+社区