昇思MindSpore学习入门-数据处理管道支持python对象

数据处理管道中的特定操作(如自定义数据集GeneratorDataset、自定义map增强操作、自定义batch(per_batch_map=...))支持任意Python类型对象作为输入。为了支持此特性,数据管道使用了Python(dict)字典去管理不同类型的对象。与其他类型相比,Python字典类型在数据管道中不会被转换成C++中的类型,而是以引用的形式保留在数据管道中。

注意,虽然目前数据管道只新增了识别字典类型的对象,但并不限制字典中的对象内容,因此也可以将其他Python类型封装进字典中并传入到数据处理管道中,以达到支持任意Python对象的目的。因此此教程主要介绍如何构造字典类型的数据输入到数据管道,并在迭代器中取得数据。

构造Python字典到数据处理管道

将字典输入到数据处理管道中可在以下几个操作中实现:

  1. 自定义数据集GeneratorDataset,用户将组织好的字典以返回值的形式输入到数据处理管道中;
  2. 自定义map增强操作,用户可以定义Python可调用对象,在该对象中返回字典数据;
  3. 自定义batch(per_batch_map=...)操作,用户在batch操作的per_batch_map中处理并返回字典数据。

自定义数据集GeneratorDataset处理字典对象

下面这个例子展示了如何通过GeneratorDataset将字典对象传送到数据处理管道。

示例中的my_generator返回了2个元素,分别对应2个数据列,其中字典被视为其中一列,即col1。特别的,数据处理管道的规则一般会检查返回值是否可以被转换为NumPy类型,但若返回值为字典则会例外,且字典中存储的元素没有限制(包括键/值的数量和的类型)。

自定义map增强操作处理字典对象

与GeneratorDataset相同,每个字典对象被看作一个数据列,且其中的元素没有限制。

这个例子说明如何通过map操作和自定义Python方法,将字典类型加入到数据处理管道中:

batch操作处理字典对象

当对数据集使用batch操作时,如果有一个数据列中包含有字典对象,数据处理管道会将多组样本中的字典的相同键组合在一起。因此对数据进行batch操作前,确保所有的字典对象都必须具有相同的键。

batch操作的结果(对于该列)也将是一个字典,其中所有值都是NumPy数组。如果这种转换产生了np.object_类型的数组,由于模型训练侧的限制,将向用户显示一条错误消息并且终止数据处理管道。

下面展示了当数据管道中存在Python字典时,batch操作是如何把字典中"power"键的元素组合起来的。

如果用户提供了per_batch_map函数,字典中的对应元素将根据键分组到Python列表中。这个例子说明如何通过batch操作和per_batch_map方法,将字典类型加入到数据处理管道中:

从数据处理管道中获取Python字典

直接迭代数据集对象即可获得字典类型的数据。当使用迭代器获取数据时,数据处理管道会尝试将字典对象中的所有值转成Tensor类型(如果output_numpy设置为True,则将转为NumPy类型)。

注意,上述类型转换操作是递归进行的,即应用于嵌套字典内的所有值以及列表和元组内的所有元素。无法被转成NumPy数组/Tensor类型的对象(例如类对象)会被直接传入到模型,若模型无法处理该对象类型将会报错。

下面的例子展示了通过迭代器获取字典数据或其他数据。

在模型训练/推理场景,从数据管道获取字典类型数据时有以下注意事项。

  • 数据下沉模式下,由于数据下沉通道当前无法支持字典类型的数据,字典类型的数据发送到下沉通道会造成错误。因此可以考虑关闭数据下沉模式(dataset_sink_mode=False),或在最后一个数据处理节点将字典类型的数据展开为列表或元组类型的数据,例如:
相关推荐
可观测性用观测云4 分钟前
观测云推出 OpenClaw 可观测插件:从黑盒到白盒,让每次 AI 执行皆有迹可循
人工智能
阿里云大数据AI技术4 分钟前
告别“金鱼记忆”:Hologres + Mem0,为大模型打造企业级长记忆引擎
人工智能·llm
VIP_CQCRE4 分钟前
Recaptcha2 图像识别 API 集成指南
ai
xht08325 分钟前
PHP vs Python:编程语言终极对决
开发语言·python·php
周末程序猿6 分钟前
技术总结|十分钟抓包逆向分析 `Claude-Code`
人工智能
计算机安禾8 分钟前
【数据结构与算法】第3篇:C语言核心机制回顾(二):动态内存管理与typedef
c语言·开发语言·数据结构·c++·算法·链表·visual studio
23.8 分钟前
【Java】char字符类型的UTF-16编码解析
java·开发语言·面试
Theodore_10229 分钟前
深度学习(11):偏差与方差诊断、学习曲线
人工智能·笔记·深度学习·神经网络·机器学习·计算机视觉
无小道12 分钟前
关于mmap的理解和使用
开发语言·mmap
2401_8796938715 分钟前
使用Python控制Arduino或树莓派
jvm·数据库·python