使用python处理MNIST数据集

文章目录

  • 一. MNIST数据集
    • 1.1 什么是MNIST数据集
    • 1.2MNIST数据集文件格式
    • 1.3使用python访问MNIST数据集文件内容
  • 附录
    • 程序源码

一. MNIST数据集

1.1 什么是MNIST数据集

MNIST数据集是入门机器学习/识别模式的最经典数据集之一。最早于1998年Yan Lecun在论文:[Gradient-based learning applied to document recognition]中提出。该数据集包含了0-9共10类手写数字图片,每张图片都做了尺寸归一化,都是28x28大小的灰度图。每张图片中的像素大小在0-255之间,其中0是黑色,255是白色。如下图所示:

在这里插入图片描述

MNIST共包含70000张手写数字图片,其中有60000张用作训练集,10000张用作测试集。元数据集可以在MNIST官网下载。下载之后得到4个压缩文件:

train-images-idx3-ubyte.gz #60000张训练集图片
train-labels-idx1-ubyte.gz #60000张训练集图片对应的标签
t10k-images-idx3-ubyte.gz  #10000张测试集图片
t10k-labels-idx1-ubyte.gz  #10000张测试集图片对应的标签

将上面的4个压缩文件分别解压,得到:

train-images-idx3-ubyte #60000张训练集图片的idx3-ubyte格式文件
train-labels-idx1-ubyte #60000张训练集图片对应的标签的idx3-ubyte格式文件
t10k-images-idx3-ubyte  #10000张测试集图片的idx3-ubyte格式文件
t10k-labels-idx1-ubyte  #10000张测试集图片对应的标签的idx3-ubyte格式文件

1.2MNIST数据集文件格式

解压得到的4个文件都是二进制格式的文件,为了获取其中的信息,需要先了解MNIST二进制文件的存储格式。格式描述如下:
在这里插入图片描述

  • 第1-4个byte(字节,1byte=8bit),即前32bit存的是文件的magic number,对应的十进制大小是2051;
  • 第5-8个byte存的是number of images,即图像数量60000;
  • 第9-12个byte存的是每张图片行数/高度,即28;
  • 第13-16个byte存的是每张图片的列数/宽度,即28。
  • 从第17个byte开始,每个byte存储一张图片中的一个像素点的值。

1.3使用python访问MNIST数据集文件内容

知道了MNIST二进制文件的存储方式,下面介绍如何使用python访问文件内容。同样以训练集标签文件train-labels-idx1-ubyte和训练集图像文件train-images-idx3-ubyte为例:

import numpy as np
from PIL import ImageMNIST_labels_path = 'G:\\mnist_dataset\\train-labels-idx1-ubyte\\train-labels.idx1-ubyte'  # 下载的MNIST数据集文件地址
MNIST_images_path = 'G:\\mnist_dataset\\train-images-idx3-ubyte\\train-images.idx3-ubyte'  # 下载的MNIST数据集文件地址with open(MNIST_labels_path, 'rb') as f:file_labels = f.read()  # 读入标签二进制文件
with open(MNIST_images_path, 'rb') as f:file_images = f.read()  # 读入照片二进制文件magic_number_labels = int.from_bytes(file_labels[0:4], 'big')  # 读取二进制文件的第1-4个byte( 1byte = 8bit )即magic number,并转换成10进制
number_items = int.from_bytes(file_labels[4:8], 'big')  # 读取二进制文件的第5-8个byte( 1byte = 8bit ),即number of images,并转换成10进制
print('labels: magic number = ', magic_number_labels)
print('labels: number of items = ', number_items)magic_number = int.from_bytes(file_images[0:4], 'big')  # 读取二进制文件的第1-4个byte( 1byte = 8bit )即magic number,并转换成10进制
number_images = int.from_bytes(file_images[4:8], 'big')  # 读取二进制文件的第5-8个byte( 1byte = 8bit ),即number of images,并转换成10进制
number_rows = int.from_bytes(file_images[8:12], 'big')  # 读取二进制文件的第9-12个byte( 1byte = 8bit ),即number of rows,并转换成10进制
number_columns = int.from_bytes(file_images[12:16], 'big')  # 读取二进制文件的第13-16个byte( 1byte = 8bit ),即number of columns,并转换成10进制
print('images: magic number = ', magic_number)
print('images: number of images = ', number_images)
print('images: number of rows = ', number_rows)
print('images: number of columns = ', number_columns)

使用with open() as 函数读取文件,并使用int.from_bytes()方法将文件的magic number, number of items, number of images, number of rows, number of columns,等数据读入,将字节数据转换成整数数据,从而查看图像数量、图像高度和图像宽度信息。
运行结果:

在这里插入图片描述

通过以下程序,可以将MNIST数据集二进制文件中的照片提取出来并以.png格式保存在文件夹中:

# 将二进制的图像文件中的图像提取出来并保存在文件夹中
for i in range(1, 60001):image = [item for item in file_images[16 + 28 * 28 * (i - 1):16 + 28 * 28 * i]]image_np = np.array(image, dtype=np.uint8).reshape(28, 28)im = Image.fromarray(image_np)im.save("G:\\mnist_dataset\\train-images" + "\\" + str(i) + ".png")

输出的部分照片如下所示:
在这里插入图片描述

通过以下程序,将二进制标签文件中的部分标签信息打印出来,可以发现,标签中的数据正对应于图像中的手写数字信息。

# 将二进制的标签文件中的部分标签信息打印出来
for i in range(40, 53):labels = int.from_bytes(file_labels[8 + i - 1:8 + i], 'big')print('labels' + str(i) + '=' + str(labels))

在这里插入图片描述

附录

程序源码

import numpy as np
from PIL import ImageMNIST_labels_path = 'G:\\mnist_dataset\\train-labels-idx1-ubyte\\train-labels.idx1-ubyte'  # 下载的MNIST数据集文件地址
MNIST_images_path = 'G:\\mnist_dataset\\train-images-idx3-ubyte\\train-images.idx3-ubyte'  # 下载的MNIST数据集文件地址with open(MNIST_labels_path, 'rb') as f:file_labels = f.read()  # 读入标签二进制文件
with open(MNIST_images_path, 'rb') as f:file_images = f.read()  # 读入照片二进制文件magic_number_labels = int.from_bytes(file_labels[0:4], 'big')  # 读取二进制文件的第1-4个byte( 1byte = 8bit )即magic number,并转换成10进制
number_items = int.from_bytes(file_labels[4:8], 'big')  # 读取二进制文件的第5-8个byte( 1byte = 8bit ),即number of images,并转换成10进制
print('labels: magic number = ', magic_number_labels)
print('labels: number of items = ', number_items)magic_number = int.from_bytes(file_images[0:4], 'big')  # 读取二进制文件的第1-4个byte( 1byte = 8bit )即magic number,并转换成10进制
number_images = int.from_bytes(file_images[4:8], 'big')  # 读取二进制文件的第5-8个byte( 1byte = 8bit ),即number of images,并转换成10进制
number_rows = int.from_bytes(file_images[8:12], 'big')  # 读取二进制文件的第9-12个byte( 1byte = 8bit ),即number of rows,并转换成10进制
number_columns = int.from_bytes(file_images[12:16], 'big')  # 读取二进制文件的第13-16个byte( 1byte = 8bit ),即number of columns,并转换成10进制
print('images: magic number = ', magic_number)
print('images: number of images = ', number_images)
print('images: number of rows = ', number_rows)
print('images: number of columns = ', number_columns)# 将二进制的图像文件中的图像提取出来并保存在文件夹中
for i in range(1, 60001):image = [item for item in file_images[16 + 28 * 28 * (i - 1):16 + 28 * 28 * i]]image_np = np.array(image, dtype=np.uint8).reshape(28, 28)im = Image.fromarray(image_np)im.save("G:\\mnist_dataset\\train-images" + "\\" + str(i) + ".png")# 将二进制的标签文件中的部分标签信息打印出来
for i in range(40, 53):labels = int.from_bytes(file_labels[8 + i - 1:8 + i], 'big')print('labels' + str(i) + '=' + str(labels))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/139885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis基础之SqlSession

SqlSession 线程安全问题 当你翻看 SqlSession 的源码时,你会发现它只是一个接口。我们通过 MyBatis 操作数据库,实际上就是通过 SqlSession 获取一个 JDBC 链接,然后操作数据库。 SqlSession 接口有 3 个实现类: #实现类1Defa…

【Verilog语法】比较不同计数器的运算方式,其中有一个数是延迟打一拍的效果,目的是使得两个计数器的结果相同。

比较不同计数器的运算方式,其中有一个数是延迟打一拍的效果,目的是使得两个计数器的结果相同。 1,第一种2,第二种3,第三种 第三种方案,完成实现。 1,第一种 (1)RTL modu…

索引(含B树、B+树)

1、索引(index) 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。 一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。 索引相当于一本书的目录,是为了缩小扫描…

数据仓库整理

数仓 olap vs oltp OLTP主要用于支持日常的业务操作,如银行交易、电子商务等,强调数据的准确性、实时性和并发性。OLAP主要用于支持复杂的数据分析,如数据仓库、决策支持等,强调数据的维度、聚合和可视化。 将OLTP数据库的数据…

Intellij idea 2023 年下载、安装教程、亲测可用

文章目录 1 下载与安装IDEA2 常用设置设置 Java JDK 版本自动导入包、移除包IDEA 自动生成 author 注释签名java.io.File 类无法自动提示导入?高亮显示与选中字符串相同的内容IDEA 配置 MavenIDEA 连接 Mysql 数据库 3 参考文章 1 下载与安装IDEA 首先先到官网下载…

硬件知识积累 网口接口 百兆,千兆,万兆 接口介绍与定义 (RJ45 --简单介绍)

1. 百兆网口 1.1百兆网的定义 百兆网的意思是是100Mb/S,中文叫做100兆位/秒。 1.2百兆网口的常用连接器 1.1.1 一般百兆网口的连接器一般是RJ45 下面是 实物图, 原理图,封装图。 1.3 百兆网口连接线的介绍 1.3.1 百兆需要使用的线的定义 百…

基于Vue+ELement搭建登陆注册页面实现后端交互

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

代码随想录算法训练营 动态规划part17

一、回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int countSubstrings(String s) {boolean[][] dp new boolean[s.length()][s.length()];int ans 0;for (int j 0; j < s.length(); j) {for (int i 0; i < j; i) {if …

stm32无人机-飞行力学原理

惯性导航&#xff0c;是一种无源导航&#xff0c;不需要向外部辐射或接收信号源&#xff0c;就能自主进行确定自己在什么地方的一种导航方法。 惯性导航主要由惯性器件计算实现&#xff0c;惯性器件包括陀螺仪和加速度计。一般来说&#xff0c;惯性器件与导航物体固连&#xf…

EMQX Enterprise 5.2 发布:Flow 设计器,Amazon Kinesis,Azure Event Hubs

EMQX Enterprise 5.2.0 版本现已正式发布&#xff01; 新版本带来了一系列重磅更新&#xff0c;最令人瞩目的是可拖拽的可视化 Flow 设计器&#xff0c;它可以帮助企业快速创建、测试和部署数据集成。同时&#xff0c;我们新增了对 Amazon Kinesis 和 Azure Event Hubs 的支持…

Flowable主要子流程介绍

1. 内嵌子流程 &#xff08;1&#xff09;说明 内嵌子流程又叫嵌入式子流程&#xff0c;它是一个可以包含其它活动、分支、事件&#xff0c;等的活动。我们通常意义上说的子流程通常就是指的内嵌子流程&#xff0c;它表现为将一个流程&#xff08;子流程&#xff09;定…

【再识C进阶3(上)】详细地认识字符串函数、进行模拟字符串函数以及拓展内容

小编在写这篇博客时&#xff0c;经过了九一八&#xff0c;回想起了祖国曾经的伤疤&#xff0c;勿忘国耻&#xff0c;振兴中华&#xff01;加油&#xff0c;逐梦少年&#xff01; 前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;…

Linux 链表示例 LIST_INIT LIST_INSERT_HEAD

list(3) — Linux manual page 用Visual Studio 2022创建CMake项目 * CmakeLists.txt # CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.12)project ("llist")# I…

Remix 2.0 正式发布,现代化全栈Web框架!

9 月 16 日&#xff0c;全栈 Web 框架 Remix 正式发布了 2.0 版本&#xff0c;Remix 团队在发布 1.0 版本后经过近 2 年的持续努力&#xff0c;发布了 19 个次要版本、100 多个补丁版本&#xff0c;并解决了数千个问题和拉取请求&#xff0c;终于迎来了第二个主要版本&#xff…

【数据结构】二叉搜索树与Map和Set

目录 ♫二叉搜索树 ♪什么是二叉搜索树 ♪二叉搜索树的特性 ♪模拟实现二叉搜索树 ♫Map ♪什么是Map ♪Map的内部类 ♪Map的常用方法 ♪Map的遍历 ♫Set ♪什么是Set ♪Set的常用方法 ♪Set的遍历 ♫二叉搜索树 ♪什么是二叉搜索树 二叉搜索树又称二叉排序树&#…

多线程带来的的风险-线程安全

多线程带来的的风险-线程安全 ~~ 多线程编程中,最难的地方,也是一个最重要的地方&#xff0c;还是一个最容易出错的地方,更是一个面试中特别爱考的地方.❤️❤️❤️ 线程安全的概念 万恶之源,罪魁祸首是多线程的抢占式执行,带来的随机性.~~&#x1f615;&#x1f615;&…

14:00面试,14:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

redis安装问题

title: “Redis安装问题” createTime: 2022-01-04T20:47:0608:00 updateTime: 2022-01-04T20:47:0608:00 draft: false author: “name” tags: [“redis”] categories: [“install”] description: “测试的” title: redis安装可能遇到的错误 createTime: 2022-01-04T20:47…

第52节:cesium 3DTiles模型特效+选中高亮(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><vc-navigation

【【萌新的FPGA学习之实战流水灯】】

萌新的FPGA学习之实战流水灯 实验任务 本节的实验任务是使用领航者底板上的两个 PL LED 灯顺序点亮并熄灭&#xff0c;循环往复产生流水灯的效 果&#xff0c;流水间隔时间为 0.5s。 1MHz&#xff1d;1000000Hz 10的6次方 1ns&#xff1d;10的-9次方秒 开发板晶振50Mhz 计算得…