MNIST 数据集 ubyte 格式介绍

news2024/10/6 2:46:56

train-images-idx1-ubyte 文件是用于存储 MNIST 数据集中手写数字图像数据的文件。与标签文件类似,这个文件使用的是一种简单而紧凑的二进制格式。具体的文件格式如下:

  1. 文件头(Header)
    文件头部分包含了一些描述文件内容的信息,具体如下:

    • 魔数(Magic Number):文件的前 4 个字节,用于标识文件类型。对于图像文件,魔数通常是 2051(十进制)。
    • 图像数量:紧随魔数之后的 4 个字节,表示文件中包含的图像数量。
    • 图像高度:再接下来的 4 个字节,表示图像的高度(像素)。
    • 图像宽度:紧随图像高度之后的 4 个字节,表示图像的宽度(像素)。
  2. 图像数据
    图像数据部分紧随文件头之后,包含了所有图像的像素数据,每个像素占用 1 个字节(0 到 255 之间的灰度值)。

具体来说,文件的格式可以用伪代码表示如下:

[header]
| magic number (4 bytes) | number of images (4 bytes) | number of rows (4 bytes) | number of columns (4 bytes) |
[images]
| pixel 1 (1 byte) | pixel 2 (1 byte) | ... | pixel N (1 byte) |

其中,每个图像的数据按行优先顺序存储(即每行的像素从左到右排列,按行排列)。

读取 train-images-idx1-ubyte 文件的示例代码

以下是一个 Python 示例代码,用于读取和解析 train-images-idx1-ubyte 文件:

import struct
import numpy as np
import matplotlib.pyplot as plt

def read_images(file_path):
    with open(file_path, 'rb') as file:
        # 读取魔数和图像信息
        magic_number, num_images, num_rows, num_columns = struct.unpack('>IIII', file.read(16))
        print(f"Magic Number: {magic_number}, Number of Images: {num_images}, Rows: {num_rows}, Columns: {num_columns}")
        
        # 读取所有图像
        images = np.fromfile(file, dtype=np.uint8).reshape(num_images, num_rows, num_columns)
    
    return images

# 使用示例
file_path = 'train-images-idx3-ubyte'
images = read_images(file_path)
print(f"First Image Shape: {images[0].shape}")

# 显示第一张图像
plt.imshow(images[0], cmap='gray')
plt.show()

在这段代码中:

  • 使用 struct.unpack 方法从文件中读取二进制数据。
  • '>IIII' 表示以大端序读取四个 4 字节的无符号整数,分别对应魔数、图像数量、图像高度和图像宽度。
  • np.fromfile 方法从文件中读取剩余的像素数据,并将其重塑为 (num_images, num_rows, num_columns) 的形状。

通过上述代码,可以将 train-images-idx1-ubyte 文件中的所有图像数据读取到一个 NumPy 数组中,并展示第一张图像。

train-labels-idx1-ubyte 是一个存储在 Ubyte 格式中的文件,常用于 MNIST 数据集的标签文件。这个文件的格式是一个二进制文件,包含了手写数字图片对应的标签。它的存储结构是非常简单和紧凑的,下面是具体的存储格式:

  1. 文件头(Header)
    文件头部分包含了一些描述文件内容的信息,具体如下:

    • 魔数(Magic Number):文件的前 4 个字节,用于标识文件类型。对于标签文件,魔数通常是 2049(十进制)。
    • 标签数量:紧随魔数之后的 4 个字节,表示文件中包含的标签数量。
  2. 标签数据
    标签数据部分紧随文件头之后,包含了所有图片的标签,每个标签占用 1 个字节(表示 0 到 9 之间的数字)。

具体来说,文件的格式可以用伪代码表示如下:

[header]
| magic number (4 bytes) | number of items (4 bytes) |
[labels]
| label 1 (1 byte) | label 2 (1 byte) | ... | label N (1 byte) |

读取 train-labels-idx1-ubyte 文件的示例代码

以下是一个 Python 示例代码,用于读取和解析 train-labels-idx1-ubyte 文件:

import struct

def read_labels(file_path):
    with open(file_path, 'rb') as file:
        # 读取魔数和标签数量
        magic_number, num_labels = struct.unpack('>II', file.read(8))
        print(f"Magic Number: {magic_number}, Number of Labels: {num_labels}")
        
        # 读取所有标签
        labels = []
        for _ in range(num_labels):
            label = struct.unpack('B', file.read(1))[0]
            labels.append(label)
    
    return labels

# 使用示例
file_path = 'train-labels-idx1-ubyte'
labels = read_labels(file_path)
print(f"First 10 Labels: {labels[:10]}")

在这段代码中:

  • 使用 struct.unpack 方法从文件中读取二进制数据。
  • '>II' 表示以大端序读取两个 4 字节的无符号整数,分别对应魔数和标签数量。
  • 'B' 表示读取一个 1 字节的无符号整数,表示一个标签。

通过上述代码,可以将 train-labels-idx1-ubyte 文件中的所有标签读取到一个列表中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高德地图 key 和安全密钥使用

参考高德地图:JS API 安全密钥使用 高德地图 key 和安全密钥使用 一、通过明文方式设置参数查看如下成功后返回的信息 二、通过代理服务器转发实验:通过本地地址转发返回错的错误信息,如下通过正确的项目的的服务地址,返回正常参数…

Flink,spark对比

三:az 如何调度Spark、Flink,MR 任务 首先,使用java编写一个spark任务,定义一个类,它有main方法,里面写好逻辑,sparkConf 和JavaSparkContext 获取上下文,然后打成一个jar包&#xf…

深度学习之网络构建

目标 选择合适的神经网络 卷积神经网络(CNN):我们处理图片、视频一般选择CNN 循环神经网络(RNN):我们处理时序数据一般选择RNN 超参数的设置 为什么训练的模型的错误率居高不下 如何调测出最优的超参数 …

Node.js介绍 , 安装与使用

1.Node.js 1 什么是Node.js 官网:https://nodejs.org/zh-cn/ 中文学习网:http://nodejs.cn/learn1.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 2.前端的底层 html…

C++、QT企业管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端: 1、【产品中心】产品案列、新闻动态的发布; 2、【员工管理】新增、修改、删除、搜索功能;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

下载nvm 管理多个node版本并切换

nvm管理多个node版本并切换 安装nvm时不能安装任何node版本(先删除node再安装nvm),保证系统无任何node.js残留 1. 卸载node 控制面板中卸载nodejs 删除以下文件夹: C:\Program Files (x86)\Nodejs C:\Program Files\Nodejs C…

聚类分析方法(一)

目录 一、聚类分析原理(一)聚类分析概述(二)聚类的数学定义(三)簇的常见类型(四)聚类框架及性能要求(五)簇的距离 二、划分聚类算法(一&#xff0…

【matlab】状态空间模型与传递函数模型的建立与转换

目录 SISO系统 MIMO系统 状态空间模型 状态空间模型到传递函数模型的转换 传递函数模型到状态空间模型的转换 (1) 转换函数ss() (2) 规范形转换函数canon() (3) 常微分方程(传递函数)转换为状态空间模型函数dif2ss() 状态空间模型的变换 特征值、特征向量与广义特征向量的计算…

进程控制-wait和waitpid进程回收

wait 阻塞函数 函数作用: 1. 阻塞并等待子进程退出 2. 回收子进程残留资源 3. 获取子进程结束状态(退出原因) pid_t wait(int *wstatus); 返回值: ‐1 : 回收失败,已经没有子进程了 >0 : 回收子进程对应的…

线上问题---反思与回顾

线上问题一:麦哲伦2.0 人群配置不生效 发现背景:产品发现三层模型部分计划个别测试计划圈选人群特征与数仓统计数据的人群不一致,向值班人员反馈 根因定位: (1)用户配置三层模型计划时,配置单…

文心一言 VS 讯飞星火 VS chatgpt (297)-- 算法导论22.1 1题

一、给定有向图的邻接链表,需要多长时间才能计算出每个结点的出度(发出的边的条数)?多长时间才能计算出每个结点的入度(进入的边的条数)?如果要写代码,请用go语言。 文心一言: 计算出度 对于有向图的邻接链表表示&a…

rufus-4.5 制作 Clonezilla(再生龙)启动盘报syslinux-6.04下载错误

1、官网下载rufus 官网下载rufus-4.5,下载地址:https://rufus.ie/downloads/ 2、下载再生龙(Clonezilla) 下载最新版本: Clonezilla live 版本: 3.1.2-22:https://sourceforge.net/projects/clonezill…

在 Docker 容器中运行 Vite 开发环境,有这两个问题要注意

容器化开发给我们带来了很多便捷,但是在开发环境下也有一些问题要注意,如果不解决这些问题,你的开发体验不会很好。 容器启动正常,却无法访问 我们用 Docker 启动一个 Vite Vue3 项目的开发环境后,发现端口日志一切…

Springboot使用WebSocket发送消息

1. 创建springboot项目&#xff0c;引入spring-boot-starter-websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>完整项目依赖 <?xml ver…

【游戏客户端】大话版本slg玩法正式上线~~

【游戏客户端】制作率土之滨Like玩法 大家好&#xff0c;我是Lampard家杰~~ 好久好久没有更新博客了&#xff0c;有不少大佬都在后台私信我催更&#xff0c;但是很悲伤这段时间都忙的不行QAQ 那在忙什么呢&#xff1f;就是在制作一个SLG类的玩法【帮派纷争】啦 &#xff0c;布…

RNN、LSTM与GRU循环神经网络的深度探索与实战

循环神经网络RNN、LSTM、GRU 一、引言1.1 序列数据的迷宫探索者&#xff1a;循环神经网络&#xff08;RNN&#xff09;概览1.2 深度探索的阶梯&#xff1a;LSTM与GRU的崛起1.3 撰写本博客的目的与意义 二、循环神经网络&#xff08;RNN&#xff09;基础2.1 定义与原理2.1.1 RNN…

java 闭锁(CountDownLatch)

闭锁&#xff08;CountDownLatch&#xff09;是Java中的一个同步辅助类&#xff0c;用于协调多个线程之间的协作。它允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成。闭锁非常适用于需要等待一组事件发生之后再执行某些操作的场景。 import java.uti…

【Java】垃圾回收学习笔记(二):分代假说与垃圾回收算法

文章目录 0. 分代收集理论分代假说分代GC定义 1. 垃圾回收算法1.1 标记清除&#xff08;Mark-Sweep&#xff09;算法优点缺点 1.2 标记复制算法优点缺点为什么是8:1:1&#xff1f; 1.3 标记整理算法优点缺点 2. 是否移动&#xff1f; 0. 分代收集理论 分代假说 现在多数JVM G…

Python编程学习笔记(2)--- 列表简介

1、列表是什么 列表由一系列按特定顺序排列的元素组成。可以创建包含字母表中所有字母、数字、0~9或所有家庭成员姓名的列表&#xff1b;也可以将任何东西加入列表中&#xff0c;其中的元素之间可以没有任何关系。列表通常包含多个元素&#xff0c;因此给列表指定一个表示复数…

python库(6):Pygments库

1 Pygments介绍 在软件开发和文档编写中&#xff0c;代码的可读性是至关重要的一环。无论是在博客文章、技术文档还是教程中&#xff0c;通过代码高亮可以使程序代码更加清晰和易于理解。而在Python世界中&#xff0c;Pygments库就是这样一个强大的工具&#xff0c;它能够将各…