0


MNIST数据集ubyte格式数据解析

MNIST数据集是一个常用的手写数字识别数据集,包含了60000张训练图片和10000张测试图片。每张图片大小为28x28像素,灰度级别为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)组成。标签用于表示图片中的数字,图片用28x28的像素矩阵表示。
  • 将读取的图片数据转换为图像矩阵:MNIST数据集中的每张图片都是由28x28个像素组成的,每个像素的灰度值都在0~255之间。读取图片数据后,需要将它们转换成28x28的矩阵表示。 MNIST数据集中的标签数据以ubyte格式存储,标签文件为"train-labels-idx1-ubyte.gz"和"t10k-labels-idx1-ubyte.gz",其中前者存储了训练数据的标签,后者存储了测试数据的标签。每个标签都是一个整数,用于表示相应图片中的数字。

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

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

数据集文件头的中;

  • 前四个字节的magic number用于确定文件类型;
  • 后四个字节表示数据集的大小信息,其中前两个字节表示数据集中的图片数量,后两个字节表示每张图片的大小信息。具体来说,对于图像数据文件,后四个字节的前两个字节表示图片数量,后两个字节表示每张图片的大小,也就是28x28=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类型的像素值构成的,每张图片的大小为28x28=784个字节。像素值的范围是0~255,表示黑色到白色的灰度值。图像数据按照行优先的顺序排列,也就是说,每一行的像素值排在一起,按照行的顺序排列。图像数据的总大小是图片数量乘以每张图片的大小。

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

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


本文转载自: https://blog.csdn.net/weixin_44043309/article/details/130002491
版权归原作者 ByteVortex 所有, 如有侵权,请联系我们删除。

“MNIST数据集ubyte格式数据解析”的评论:

还没有评论