(注意:本次练习如果直接复制教程的代码会有一些字符缺失,print 只复制了 t,需要将print补全才能正确运行 )
高级数据处理包括以下几个部分:
为满足训练需求,解决诸如数据集过大或样本类别分布不均等问题,MindSpore提供了多种不同用途的采样器(Sampler),帮助用户对数据集进行不同形式的采样。用户只需在加载数据集时传入采样器对象,即可实现数据的采样。
MindSpore目前提供了如RandomSampler
、WeightedRandomSampler
、SubsetRandomSampler
等多种采样器。此外,用户也可以根据需要实现自定义的采样器类。
MindSpore中可以把用于训练网络模型的数据集,转换为MindSpore特定的格式数据(MindSpore Record格式),从而更加方便地保存和加载数据。其目标是归一化用户的数据集,并进一步通过MindDataset
接口实现数据的读取,并用于训练过程。
在资源条件允许的情况下,为了追求更高的性能,一般使用Pipeline模式执行数据变换Transforms。
基于Pipeline模式执行的最大特点是需要使用map
方法,如下图中将Resize
、Crop
、HWC2CHW
交由map
调度,由其负责启动和执行给定的Transform,对Pipeline的数据进行映射变换。
数据处理管道中的特定操作(如自定义数据集GeneratorDataset
、自定义map
增强操作、自定义batch(per_batch_map=...)
)支持任意Python类型对象作为输入。为了支持此特性,数据管道使用了Python(dict
)字典去管理不同类型的对象。与其他类型相比,Python字典类型在数据管道中不会被转换成C++中的类型,而是以引用的形式保留在数据管道中。
注意,虽然目前数据管道只新增了识别字典类型的对象,但并不限制字典中的对象内容,因此也可以将其他Python类型封装进字典中并传入到数据处理管道中,以达到支持任意Python对象的目的。因此此教程主要介绍如何构造字典类型的数据输入到数据管道,并在迭代器中取得数据。