深度学习-我是小白入门:Mnist数据的读取和查看
利用VS2017的python环境编写代码查看Mnist内容
1.函数介绍
从numpy库引入函数:frombuffer(buffer,dtype=float,count=-1,offset=0)
是个读取二进制文件的函数
官方介绍如下:
四个参数:buffer是图片文件的数据,dtype是图片数据格式,count是读取文件内的多少个数据,offset是从哪个数据开始读取,如何取值,在下文会有介绍。
2.观察文件特征
首先,文件有4个,其中两个train和两个t10k,其中train是6万个训练数据,t10k是1万个测试数据。两个t10k又分image和label,image是图片数据,label是图片的标签,也就是图片上的数字。下面用vscode打开文件时可以看出,label文件主体上都是只有00-09十个数字,表示图片上的数字只有0-9,而image文件是00-FF,表示的是每一张图片的像素值。
使用VScode的插件 Hexdump,打开文件,对文件右键选择Show Hexdump观察
1. 观察t10k-label文件:
看到16进制的一坨数字,一组数是2个数字。
第一行(offset不算行)里前8组中,每4组,即8个数字是一个内容,8位的16进制,也就是32位的二进制数
offset行的数字表示列数,
00~03列的数字00000801是magic number 魔数,不读
04~07列的数字00002710是16进制,等于十进制的10000,number of items表示有10000个标签
08列开始的数字,每一组就是对应图片上的数字值。比如08列的07,表示第一张图片上是7,09列的02表示第二张图上是2.
所以label是从offset等于8,即从08列数字开始读取数字,每读取1组,也就是2个数字。所以count=2是读取一个标签
附上官方介绍:
2. 观察t10k-image文件:
第一行(offset不算行)每4组,即8个数字是一个内容
00~03的数字00000803是magic number 魔数,不读
04~07的数字00002710是16进制,等于十进制的10000,number of images表示有10000个图
08~0B的数字0000001C等于十进制的28,图片rows边的像素(pixel)个数,28个
0C~0F的数字0000001C等于十进制的28,图片columns边的像素个数,28个
第二行开始之后的所有数字就都是图片的像素值,由于0F+1=10,是十进制的16,所以读取图片从offset=16开始,一个图片有28×28=784个像素,所以count=784是读取一张图片
附上官方介绍
train的两个文件与t10k文件原理相同
3.尝试打开文件
尝试读取第一张图片的标签和数据,把标签保存到label,把图片数据保存到一个numpy数组image,并显示。
读取数据
按照以上说法,
- 一个标签是一组数两个数字,count=2,从第一行08列开始, offset=8
- 一个图片是784个像素,count=784,从第二行01开始,offset=16
- 16进制的一个数,相当于二进制的4位,那么两个16进制数就是8位二进制数,所以dtype=np.uint8
读取Label:frombuffer(label_file , dtype=np.uint8 , count=2 , offset=8)
读取Image:frombuffer(image_file , dtype= np.uint8 , count=784 , offset=16)
所以读取数据的源码:
import numpy as np
#读取 label 值
#label_path放入自己的文件地址
label_path="F:\\Files\Deep Learning\\MNISTdata\\t10k-labels.idx1-ubyte"
f1=open(label_path,'rb')
label=np.frombuffer(f1.read(),dtype=np.uint8,count=1,offset=8)
print(label)
#读取 image 值
image_path="F:\\Files\Deep Learning\\MNISTdata\\t10k-images.idx3-ubyte"
f2=open(image_path,'rb')
image0=np.frombuffer(f2.read(),dtype=np.uint8,count=784,offset=16)
#将 image0 转换成28×28矩阵
image=image0.reshape(28,28)
显示图片
显示的方法是利用PIL库,但是PIL是python2所用,并没有python3的版本,所以在python3里pip install PIL是安不上的,不过有大神开发了python3的PIL,即pip install pillow即可安装
#用PIL库
import PIL as pil
pil_image = pil.Image.fromarray(np.uint8(image))
pil_image.show()
显示结果:
其实,也可以利用matplotlib的pyplot包,或者是cv2包
使用matplotlib的pyplot包:
#用matplotlib.pyplot
from matplotlib import pyplot as plt
plt.imshow(image)
plt.show()
显示结果:
使用cv2包:
#用cv2包
import cv2 as cv
cv.imshow("1.jpg",image)
cv.waitKey()
显示第二张图片也不难,只需改变offset值:
Label:frombuffer(label_file , dtype=np.uint8 , count=2 , offset=8+1)
Image:frombuffer(image_file , dtype= np.uint8 , count=784 , offset=16+784)