欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习-我是小白入门:Mnist数据的读取和查看

程序员文章站 2022-07-11 15:36:47
...

利用VS2017的python环境编写代码查看Mnist内容

1.函数介绍

从numpy库引入函数:
frombuffer(buffer,dtype=float,count=-1,offset=0)
是个读取二进制文件的函数
官方介绍如下:
深度学习-我是小白入门:Mnist数据的读取和查看

四个参数: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,表示的是每一张图片的像素值。
深度学习-我是小白入门:Mnist数据的读取和查看
使用VScode的插件 Hexdump,打开文件,对文件右键选择Show Hexdump观察

1. 观察t10k-label文件:
深度学习-我是小白入门:Mnist数据的读取和查看
看到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是读取一个标签

附上官方介绍
深度学习-我是小白入门:Mnist数据的读取和查看
2. 观察t10k-image文件:
深度学习-我是小白入门:Mnist数据的读取和查看
第一行(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是读取一张图片

附上官方介绍
深度学习-我是小白入门:Mnist数据的读取和查看
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()

显示结果:
深度学习-我是小白入门:Mnist数据的读取和查看

其实,也可以利用matplotlib的pyplot包,或者是cv2包
使用matplotlib的pyplot包:

#用matplotlib.pyplot

from matplotlib import pyplot as plt

plt.imshow(image)
plt.show()

显示结果:
深度学习-我是小白入门:Mnist数据的读取和查看
使用cv2包:

#用cv2包
import cv2 as cv

cv.imshow("1.jpg",image)
cv.waitKey()

深度学习-我是小白入门:Mnist数据的读取和查看
显示第二张图片也不难,只需改变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)