1.1.2 MindRecord技术原理

MindRecord数据格式文件由数据文件和索引文件两部分组成,如图1.2所示。

数据文件用于存储用户归一化后的数据信息,包含文件头、标量数据页和块数据页等部分。用户可以根据需要将大数据集分片存储为多个MindRecord文件,单个文件建议不超过20GB。其中,文件头中存储了文件头大小、标量数据页大小、块数据页大小、schema数据结构信息、索引字段、统计信息、文件分区信息、标量数据与块数据对应关系等内容,是MindRecord数据格式文件的元信息;标量数据页主要用于存储标量数据,包含整型、浮点型和字符串型等数据,如图像的标签、文件名等信息;块数据页主要用于存储数据本身,可以是二进制流、NumPy数组等,如图像原始文件信息、文本转换成的字典等。

索引文件中存储了基于标量数据生成的索引信息,方便对数据进行检索及统计数据信息。

用户可以通过schema定义MindRecord中的数据结构信息,支持的基本数据类型包含int32、int64、float32、float64、string、bytes,共6种。schema为包含字段名、字段数据类型和字段维度的Python字典。代码1.1定义了字段名file_name、label和data,其中字段file_name的数据类型为string,字段label的数据类型为int32,字段data的数据类型为bytes。

图1.2 MindRecord数据格式文件构成

代码1.1 定义schema数据结构信息

实际写入的数据被定义为一个Python列表,列表中的元素为Python字典类型,对应一条样本数据,其字段名与schema相同,而对应的值为需要存储的数据本身,如代码1.2所示。此外,整型与浮点型数据也支持使用NumPy ndarray的表示方式,方便存储向量化的数据,向量维度信息通过schema中的字段维度值定义,如{"type":"int32","shape":[-1]}用于表示一个数据类型为int32的一维变长向量,而{"type":"float64","shape":[32,16]}用于表示一个数据类型为float64的二维向量,维度为[32,16]。

代码1.2 定义字段名对应数据

各种基本数据类型及其参考用途如下。

(1)int32/int64:整型数据,如图像的标签、长、宽、高等。

(2)float32/float64:浮点型数据,如图像的遮挡率、识别的难易程度值等。

(3)string:字符串类型数据,如样本的文件名、文件路径、样本描述、文本数据等。

(4)bytes:二进制数据,如图像、音频、视频的二进制原始信息等。

其中,整型(int32/int64)、浮点型(float32/float64)和字符串类型(string)的单数据为标量数据,会被存储于MindRecord的标量数据页;而向量化数据和二进制类型的数据为块数据,会被存储于MindRecord的块数据页。

定义好schema和数据之后,即可调用MindSpore提供的文件读写接口,按用户指定的格式将数据归一化写为MindRecord文件进行存储,以便后续使用。