MNIST数据库读取

MNIST数据库解析与C语言实现
这篇博客主要介绍如何读取MNIST数据库中的IMAGE FILE (train-images-idx3-ubyte)和LABEL FILE (train-labels-idx1-ubyte),并提供了一个C语言的例程序进行演示。
部署运行你感兴趣的模型镜像
手写数字识别的常用数据库,数据集的获取:http://yann.lecun.com/exdb/mnist/
数据集中有下面四个文件:
train-images-idx3-ubyte: training set images 
train-labels-idx1-ubyte: training set labels 
t10k-images-idx3-ubyte:  test set images 
t10k-labels-idx1-ubyte:  test set labels

其中训练样本有60000个,测试样本有10000个。其中测试数据集中前5000个比较清楚,容易识别,后面5000个识别相对难一点。
对于图片数据,格式是下面这样的:

IMAGE FILE (train-images-idx3-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  60000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel

所以在程序读取的时候要先偏移16个字节,才能真正的读取到实际的像素数据。数据是归一化后的,大小都是28*28,可以减少很多前期的预处理工作。

对于标签数据,格式也有点区别:

LABEL FILE (train-labels-idx1-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  60000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label

标签的值是0到9,要读取到真正的标签数据,需偏移8个字节。


c语言例程序:

int read_data(unsigned char(*data)[28][28], unsigned char label[], const int count, const char data_file[], const char label_file[])
{
	FILE *fp_image = fopen(data_file, "rb");//读图片
	FILE *fp_label = fopen(label_file, "rb");//读类标
	if (!fp_image || !fp_label) return 1;
	fseek(fp_image, 16, SEEK_SET);//从文件开始位置偏移16字节,定位像素数据
	fseek(fp_label, 8, SEEK_SET);//从文件开始位置偏移8字节,定位标签数据
	fread(data, sizeof(*data)*count, 1, fp_image);
	fread(label, count, 1, fp_label);
	fclose(fp_image);
	fclose(fp_label);
	return 0;
}


您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### 在 Jupyter Notebook 中读取 MNIST 数据库的方法 以下是关于如何在 Jupyter Notebook 中使用 PyTorch 的 `torchvision.datasets` 模块读取 MNIST 数据库的具体说明和代码示例。 --- ### 1. 导入必要的库 首先,在 Jupyter Notebook 中需要导入所需的 Python 库,包括 PyTorch 和 torchvision。这些工具提供了加载和预处理 MNIST 数据的能力。 ```python import torch import torchvision from torchvision import transforms from torch.utils.data import DataLoader ``` 上述代码中引入了以下模块: - `torch`: 主要用于张量运算以及构建神经网络模型。 - `torchvision`: 提供了许多计算机视觉方面的功能,特别是数据集加载器。 - `transforms`: 负责图像变换操作,比如标准化、调整大小等。 - `DataLoader`: 方便批量加载数据并支持多线程加速[^4]。 --- ### 2. 定义数据转换规则 为了提高模型性能,通常会对输入图片应用一些基本的预处理步骤,例如将 PIL 图像转为 Tensor 类型或者对其进行归一化处理。 ```python transform = transforms.Compose([ transforms.ToTensor(), # 将图像转化为 Tensor 形式 transforms.Normalize((0.5,), (0.5,)) # 对图像像素值做均值方差归一化 ]) ``` 这段脚本定义了一个组合式的变换链路,它会依次执行列表内的每一项操作。在这里只包含了两个简单的转化过程:一是把原生图片对象映射成适合深度学习框架使用的 tensor;二是基于经验值设定好的平均数与标准偏差来进行数值缩放[^3]。 --- ### 3. 加载 MNIST 数据集 接着利用之前创建好的 transform 参数实例化训练集和测试集对象,并指定它们各自对应的根目录位置以便于后续访问。 ```python train_dataset = torchvision.datasets.MNIST( root='./data', # 存储已下载数据的位置 train=True, # 表明这是训练集合 transform=transform, # 施加先前定制的转换逻辑 download=True # 如果本地不存在则自动联网获取资源 ) test_dataset = torchvision.datasets.MNIST( root='./data', train=False, # 明确指出这属于评估用途的数据分组 transform=transform, download=True ) ``` 注意这里的 `root` 参数指定了数据缓存地址,默认会在当前工作区下新建名为 "data" 的子文件夹存放相关内容。而布尔类型的 `download` 字段控制着当检测不到预期文件存在时是否会尝试重新抓取远程服务器上的副本[^1]。 --- ### 4. 创建 DataLoaders 实现批量化迭代 最后一步是建立能够高效管理大批量样本传递的服务接口——即所谓的 Dataloader 。通过它可以轻松完成 mini-batch 划分、随机抽样等功能配置。 ```python batch_size = 64 train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False) ``` 此部分设置了每轮次最多传输多少条记录进入 GPU/CPU 内部计算单元参与一轮更新周期的学习活动之中。同时开启打乱开关让每次 epoch 开始前都获得全新的排列顺序从而避免可能存在的模式记忆现象影响最终效果评价准确性。 --- ### 总结代码清单 综上所述,整个流程可以用下面这个紧凑版本表示出来: ```python # 导入库 import torch import torchvision from torchvision import transforms from torch.utils.data import DataLoader # 设置转换规则 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) # 下载并加载数据集 train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True) test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True) # 构建数据加载器 batch_size = 64 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值