MindSpore中可以把用于训练网络模型的数据集,转换为MindSpore特定的格式数据(MindSpore Record格式),从而更加方便地保存和加载数据。其目标是归一化用户的数据集,并进一步通过MindDataset接口实现数据的读取,并用于训练过程。
此外,MindSpore还针对部分数据场景进行了性能优化,使用MindSpore Record数据格式可以减少磁盘IO、网络IO开销,从而获得更好的使用体验。
MindSpore Record数据格式具备的特征如下:
- 实现数据统一存储、访问,使得训练时数据读取更加简便。
- 数据聚合存储、高效读取,使得训练时数据方便管理和移动。
- 高效的数据编解码操作,使得用户可以对数据操作无感知。
- 可以灵活控制数据切分的分区大小,实现分布式数据处理。
Record文件结构
如下图所示,MindSpore Record文件由数据文件和索引文件组成。
其中数据文件包含文件头、标量数据页、块数据页,用于存储用户归一化后的训练数据,且单个MindSpore Record文件建议小于20G,用户可将大数据集进行分片存储为多个MindSpore Record文件。
而索引文件则包含基于标量数据(如图像Label、图像文件名等)生成的索引信息,用于方便地检索、统计数据集信息。
数据文件中的文件头、标量数据页、块数据页的具体用途如下所示:
- 文件头:是MindSpore Record文件的元信息,主要用来存储文件头大小、标量数据页大小、块数据页大小、Schema信息、索引字段、统计信息、文件分区信息、标量数据与块数据对应关系等。
- 标量数据页:主要用来存储整型、字符串、浮点型数据,如图像的Label、图像的文件名、图像的长宽等信息,即适合用标量来存储的信息会保存在这里。
- 块数据页:主要用来存储二进制串、NumPy数组等数据,如二进制图像文件本身、文本转换成的字典等。
转换成Record格式
下面主要介绍如何将CV类数据和NLP类数据转换为MindSpore Record文件格式,并通过MindDataset接口,实现MindSpore Record文件的读取。
转换CV类数据集
本示例主要以包含100条记录的CV数据集并将其转换为MindSpore Record格式为例子,介绍如何将CV类数据集转换成MindSpore Record文件格式,并使用MindDataset接口读取。
首先,需要创建100张图片的数据集并对齐进行保存,其样本包含file_name(字符串)、label(整型)、 data(二进制)三个字段,然后使用MindDataset接口读取该MindSpore Record文件。
- 生成100张图像,并转换成MindSpore Record文件格式。
- 通过MindDataset接口读取MindSpore Record文件格式。
转换NLP类数据集
本示例首先创建一个包含100条记录的MindSpore Record文件格式,其样本包含八个字段,均为整型数组,然后使用MindDataset接口读取该MindSpore Record文件。
- 生成100条文本数据,并转换成MindSpore Record文件格式。
- 通过MindDataset接口读取MindSpore Record格式文件。
Dataset转存MindRecord
MindSpore提供转换常用数据集的工具类,能够将常用的数据集转换为MindSpore Record文件格式。
转存CIFAR-10数据集
用户可以通过Dataset.save类,将CIFAR-10原始数据转换为MindSpore Record,并使用MindDataset接口读取。
- 下载CIFAR-10数据集,并使用Cifar10Dataset加载。
- 调用Dataset.save接口,将CIFAR-10数据集转存为MindSpore Record文件格式。
- 通过MindDataset接口读取MindSpore Record文件格式。