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

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

本文章的完整代码见blog:

https://blog.csdn.net/Mimido_luoluo/article/details/104531990

1.函数介绍

从numpy库引入函数:
frombuffer(buffer,dtype=float,count=-1,offset=0)
是个读取二进制文件的函数
官方介绍如下:
buffer函数介绍

四个参数: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,表示的是每一张图片的像素值。
4个文件
使用VScode的插件 Hexdump,打开文件,对文件右键选择Show Hexdump观察

1. 观察t10k-label文件:
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是读取一个标签

附上官方介绍
test_label官方介绍
2. 观察t10k-image文件:
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是读取一张图片

附上官方介绍
test_image官方介绍
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()

显示结果:
plt包
使用cv2包:

#用cv2包
import cv2 as cv

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

cv2包
显示第二张图片也不难,只需改变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)
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值