MNIST数据集ubyte格式数据解析

MNIST数据集是一个常用的手写数字识别数据集,包含了60000张训练图片和10000张测试图片。每张图片大小为28×28像素,灰度级别为0~255。

MNIST数据集中的图片数据以ubyte格式存储,ubyte是一种无符号字节类型,取值范围在0~255之间。MNIST数据集的图像数据文件为”train-images-idx3-ubyte.gz”和”t10k-images-idx3-ubyte.gz”,其中前者存储了训练数据,后者存储了测试数据。这两个文件都可以从MNIST官方网站上下载。

解析MNIST数据集中的图片数据可以通过以下步骤完成:

  • 读取文件头信息:MNIST数据集中的图片数据文件头部包含四个字节的magic number和四个字节的数据集大小信息。magic number用于确定文件类型,数据集大小信息包括数据集中的图片数量和每张图片的大小信息。
  • 读取图片数据:MNIST数据集中的每个数据都由一个标签(label)和一个图片(image)组成。标签用于表示图片中的数字,图片用28×28的像素矩阵表示。
  • 将读取的图片数据转换为图像矩阵:MNIST数据集中的每张图片都是由28×28个像素组成的,每个像素的灰度值都在0~255之间。读取图片数据后,需要将它们转换成28×28的矩阵表示。
    MNIST数据集中的标签数据以ubyte格式存储,标签文件为”train-labels-idx1-ubyte.gz”和”t10k-labels-idx1-ubyte.gz”,其中前者存储了训练数据的标签,后者存储了测试数据的标签。每个标签都是一个整数,用于表示相应图片中的数字。

MNIST数据集中的标签数据与图片数据一一对应,可以通过标签文件中的位置信息来确定每个图片的标签。

MNIST数据集中的图片和标签数据都是按照大端字节序存储的。因此,在读取ubyte格式的数据时,需要注意字节序的问题,避免出现错误。

数据集文件头的中;

  • 前四个字节的magic number用于确定文件类型;
  • 后四个字节表示数据集的大小信息,其中前两个字节表示数据集中的图片数量,后两个字节表示每张图片的大小信息。具体来说,对于图像数据文件,后四个字节的前两个字节表示图片数量,后两个字节表示每张图片的大小,也就是28×28=784个字节;对于标签数据文件,后四个字节的前两个字节表示标签数量,后两个字节固定为0。

这些大小信息都是按照大端字节序存储的,需要注意在读取数据时进行字节序的转换。具体来说,在读取大小信息时,可以使用以下代码将大小信息转换为主机字节序:

#include <arpa/inet.h>

// 读取文件头信息
int magic_number;
int number_of_images;
int image_height;
int image_width;

// 读取magic number和大小信息
fread(&magic_number, sizeof(magic_number), 1, fp);
fread(&number_of_images, sizeof(number_of_images), 1, fp);
fread(&image_height, sizeof(image_height), 1, fp);
fread(&image_width, sizeof(image_width), 1, fp);

// 将大小信息转换为主机字节序
number_of_images = ntohl(number_of_images);
image_height = ntohl(image_height);
image_width = ntohl(image_width);

图像数据文件格式
| 魔数(4字节) | 图片数量(4字节) | 图片高度(4字节) | 图片宽度(4字节) | 图像数据 |

图像数据是由unsigned byte类型的像素值构成的,每张图片的大小为28×28=784个字节。像素值的范围是0~255,表示黑色到白色的灰度值。图像数据按照行优先的顺序排列,也就是说,每一行的像素值排在一起,按照行的顺序排列。图像数据的总大小是图片数量乘以每张图片的大小。

标签数据文件格式
| 魔数(4字节) | 标签数量(4字节) | 标签数据 |

标签数据是由unsigned byte类型的标签值构成的,每个标签值表示对应图片的数字标签,取值范围为0~9。标签数据的大小等于标签数量。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年11月7日
下一篇 2023年11月7日

相关推荐