MNIST 数据集 ubyte 格式介绍

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 文件中的所有标签读取到一个列表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwhking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值