昇思MindSpore进阶教程-格式转换
大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。
技术上主攻前端开发、鸿蒙开发和AI算法研究。
努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧
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文件格式。
from PIL import Image
from io import BytesIO
from mindspore.mindrecord import FileWriterfile_name = "test_vision.mindrecord"
# 定义包含的字段
cv_schema = {"file_name": {"type": "string"},"label": {"type": "int32"},"data": {"type": "bytes"}}# 声明MindSpore Record文件格式
writer = FileWriter(file_name, shard_num=1, overwrite=True)
writer.add_schema(cv_schema, "it is a cv dataset")
writer.add_index(["file_name", "label"])# 创建数据集
data = []
for i in range(100):sample = {}white_io = BytesIO()Image.new('RGB', ((i+1)*10, (i+1)*10), (255, 255, 255)).save(white_io, 'JPEG')image_bytes = white_io.getvalue()sample['file_name'] = str(i+1) + ".jpg"sample['label'] = i+1sample['data'] = white_io.getvalue()data.append(sample)if i % 10 == 0:writer.write_raw_data(data)data = []if data:writer.write_raw_data(data)writer.commit()
上面示例运行无报错说明数据集转换成功。
- 通过MindDataset接口读取MindSpore Record文件格式。
from mindspore.dataset import MindDataset
from mindspore.dataset.vision import Decode# 读取MindSpore Record文件格式
data_set = MindDataset(dataset_files=file_name)
decode_op = Decode()
data_set = data_set.map(operations=decode_op, input_columns=["data"], num_parallel_workers=2)# 样本计数
print("Got {} samples".format(data_set.get_dataset_size()))
转换NLP类数据集
本示例首先创建一个包含100条记录的MindSpore Record文件格式,其样本包含八个字段,均为整型数组,然后使用MindDataset接口读取该MindSpore Record文件。
- 生成100条文本数据,并转换成MindSpore Record文件格式。
import numpy as np
from mindspore.mindrecord import FileWriter# 输出的MindSpore Record文件完整路径
file_name = "test_text.mindrecord"# 定义样本数据包含的字段
nlp_schema = {"source_sos_ids": {"type": "int64", "shape": [-1]},"source_sos_mask": {"type": "int64", "shape": [-1]},"source_eos_ids": {"type": "int64", "shape": [-1]},"source_eos_mask": {"type": "int64", "shape": [-1]},"target_sos_ids": {"type": "int64", "shape": [-1]},"target_sos_mask": {"type": "int64", "shape": [-1]},"target_eos_ids": {"type": "int64", "shape": [-1]},"target_eos_mask": {"type": "int64", "shape": [-1]}}# 声明MindSpore Record文件格式
writer = FileWriter(file_name, shard_num=1, overwrite=True)
writer.add_schema(nlp_schema, "Preprocessed nlp dataset.")# 创建虚拟数据集
data = []
for i in range(100):sample = {"source_sos_ids": np.array([i, i + 1, i + 2, i + 3, i + 4], dtype=np.int64),"source_sos_mask": np.array([i * 1, i * 2, i * 3, i * 4, i * 5, i * 6, i * 7], dtype=np.int64),"source_eos_ids": np.array([i + 5, i + 6, i + 7, i + 8, i + 9, i + 10], dtype=np.int64),"source_eos_mask": np.array([19, 20, 21, 22, 23, 24, 25, 26, 27], dtype=np.int64),"target_sos_ids": np.array([28, 29, 30, 31, 32], dtype=np.int64),"target_sos_mask": np.array([33, 34, 35, 36, 37, 38], dtype=np.int64),"target_eos_ids": np.array([39, 40, 41, 42, 43, 44, 45, 46, 47], dtype=np.int64),"target_eos_mask": np.array([48, 49, 50, 51], dtype=np.int64)}data.append(sample)if i % 10 == 0:writer.write_raw_data(data)data = []if data:writer.write_raw_data(data)writer.commit()
- 通过MindDataset接口读取MindSpore Record格式文件。
from mindspore.dataset import MindDataset# 读取MindSpore Record文件格式
data_set = MindDataset(dataset_files=file_name, shuffle=False)# 样本计数
print("Got {} samples".format(data_set.get_dataset_size()))# 打印部分数据
count = 0
for item in data_set.create_dict_iterator(output_numpy=True):print("source_sos_ids:", item["source_sos_ids"])count += 1if count == 10:break
Dataset转存MindRecord
MindSpore提供转换常用数据集的工具类,能够将常用的数据集转换为MindSpore Record文件格式。
转存CIFAR-10数据集
用户可以通过Dataset.save类,将CIFAR-10原始数据转换为MindSpore Record,并使用MindDataset接口读取。
- 下载CIFAR-10数据集,并使用Cifar10Dataset加载。
from download import download
from mindspore.dataset import Cifar10Dataseturl = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/cifar-10-binary.tar.gz"path = download(url, "./", kind="tar.gz", replace=True)
dataset = Cifar10Dataset("./cifar-10-batches-bin/") # 加载数据
- 调用Dataset.save接口,将CIFAR-10数据集转存为MindSpore Record文件格式。
dataset.save("cifar10.mindrecord")
- 通过MindDataset接口读取MindSpore Record文件格式。
import os
from mindspore.dataset import MindDataset# 读取MindSpore Record文件格式
data_set = MindDataset(dataset_files="cifar10.mindrecord")# 样本计数
print("Got {} samples".format(data_set.get_dataset_size()))if os.path.exists("cifar10.mindrecord") and os.path.exists("cifar10.mindrecord.db"):os.remove("cifar10.mindrecord")os.remove("cifar10.mindrecord.db")
相关文章:

昇思MindSpore进阶教程-格式转换
大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 MindSpore中可以把用于训练网络模型的数据…...

搜索软件 Everything 的安装与使用教程
一、Everything简介 适用于 Windows 的免费搜索工具 Everything 是 Windows 的即时搜索引擎。发现、整理并轻松访问文件和文件夹,一切尽在指尖! PS:Everything无法对文件内容进行搜索,只能根据文件名和路径进行搜索 二、Everyt…...

oracle 如何判断当前时间在27号到当月月底
在Oracle中,您可以使用TRUNC和LAST_DAY函数来判断当前时间是否在27号到当月月底之间。以下是一个SQL示例: SELECT CASE WHEN TRUNC(SYSDATE) > TRUNC(SYSDATE, DD) 26 AND TRUNC(SYSDATE) < LAST_DAY(SYSDATE) THEN 当前时间在27号到当月月底之间…...

Django 配置邮箱服务,实现发送信息到指定邮箱
一、这里以qq邮箱为例,打开qq邮箱的SMTP服务 二、django项目目录设置setting.py 文件 setting.py 添加如下内容: # 发送邮件相关配置 EMAIL_BACKEND django.core.mail.backends.smtp.EmailBackend EMAIL_USE_TLS True EMAIL_HOST smtp.qq.com EMAIL…...

Git使用手册
1、初识Git 概述:Git 是一个开源的分布式版本控制系统,可以有效、高速地处理项目版本管理。 知识点补充: 版本控制:一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 分布式:每个人…...

sql-labs靶场
第一关(get传参,单引号闭合,有回显,无过滤) ?id-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schemasecurity) -- 第二关(get传参,无闭…...

【Redis入门到精通二】Redis核心数据类型(String,Hash)详解
目录 Redis数据类型 1.String类型 (1)常见命令 (2)内部编码 2.Hash类型 (1)常见命令 (2)内部编码 Redis数据类型 查阅Redis官方文档可知,Redis提供给用户的核心数据…...

如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像源解决群晖Docker获取注册表失败的问题)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Docker无法拉取镜像 📒📒 解决方案 📒🔖 方法一:免费快速搭建自己的Docker镜像源🎈 部署🎈 使用🔖 备用方案⚓️ 相关链接 🚓️📖 介绍 📖 在当前的网络环境下,Docker镜像的拉取问题屡见不鲜(各类Nas查询…...

QT 获取视频帧Opencv获取清晰度
先展示结果: 1.获取摄像头的分辨率 mResSize.clear();mResSize camera_->supportedViewfinderResolutions();ui->comboBox_resulation->clear();int i0;foreach (QSize msize, mResSize) {qDebug()<<msize;ui->comboBox_resulation->addItem(…...

生成式AI如何辅助医药行业智能营销
生成式AI在医药行业的智能营销中发挥着日益重要的作用,它通过多种方式辅助医药企业提升市场洞察能力、优化营销策略、增强客户互动和体验,从而推动销售增长和品牌价值的提升。以下是生成式AI如何辅助医药行业智能营销的具体方式:一、精准市场…...

演示:基于WPF的DrawingVisual开发的Chart图表和表格绘制
一、目的:基于WPF的DrawingVisual开发的Chart图表和表格绘制 二、预览 钻井井轨迹表格数据演示示例(应用Table布局,模拟井轨迹深度的绘制) 饼图表格数据演示示例(应用Table布局,模拟多个饼状图组合显示&am…...

汽车保养BBBBBBBBBBB
小保养就是机油和机滤,4s店比较贵,可以在京东上买机油,可以包安装 极护、磁护 两款机油配方不同,极护系列机油注入液钛配方,拥有特别的油膜自适应能力,在各种形式条件下均能有效减少金属间的直接接触&…...

H3C R4900 G3服务器上配置本地磁盘RAID
首先web登录HDM后,查看本地磁盘 开机后在如下界面中按F10 等待后如下截图:单击“系统安装” 如下截图。默认选择,单击“下一步” 如下RAID配置,选中2个同样大的磁盘,单击“创建” 在跳出界面中,配置为RAID 1,输入需要的...

HBase DDL操作代码汇总(namespace+table CRUD操作)
HBase DDL操作 DDL操作主要是关于命名空间和表格的内容增删改查。 注:如果出现无法连接到zookeeper等的相关错误,可以将以下代码打jar包,在HMaster节点上执行 错误提示: Exception in thread “main” java.net.SocketTimeoutExc…...

关于TCP的基础知识
关于TCP的基础知识 TCP 是 Transmission Control Protocol 的缩写,中文意思是传输控制协议。 TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议,它位于 OSI 模型的第四层(传输层)。TCP 协议通过建立连接、维护连接状态、…...

MyBatis 中的类型别名配置详解
目录 1. 什么是类型别名? 2. 类型别名的配置方法 2.1 使用单个标签 2.2 使用标签批量扫描 2.3 使用Alias注解 3. 注意事项 4. 相关知识拓展 4.1 MyBatis的映射文件 4.2 MyBatis的动态SQL 4.3 MyBatis与Spring的整合 4.4 性能优化 5. 结论 在现代Java开发…...

如何提高UI自动化的稳定性
用例层面: 1. 将用例设计成参数化,将测试数据通过参数进行传递 2. 对于一些可能会变化的参数,将其设计成全局变量,减少维护用例的成本 3. 对用例之间避免产生依赖,可以独立执行 框架层面: 1. 使用PO设…...

ubuntu如何开启和关闭图形界面
在Ubuntu中,你可以根据需要开启或关闭图形界面。以下是具体的方法: 关闭图形界面 方法一:使用 systemctl 命令 打开终端。输入以下命令切换到多用户目标(相当于关闭图形界面):sudo systemctl set-defaul…...

从博客到ICT社区:深化学习与交流的桥梁
大家好,我是你们熟悉的云途-CloudJourney。在这个信息爆炸的时代,我一直致力于通过博客、公众号等平台,与大家分享关于Linux、K8S、Docker、网络、服务器以及OpenStack等前沿技术的见解与心得。然而,随着交流的深入,我…...

基于python+django+vue的旅游景点数据分析系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...

C++简单缓冲区类设计
目录 1.引言 2.静态缓冲区 3.动态缓冲区 4.数据引用类 5.自动数据引用类 6.几种缓冲区的类关系图 7.注意事项 8.完整代码 1.引言 在C中,设计静态和动态缓冲区类时,需要考虑的主要差异在于内存管理的方式。静态缓冲区类通常使用固定大小的内存区域…...

MySQL 数据库
1. MySQL 数据库的基础知识 这一部分将带你了解 MySQL 数据库的核心概念。无论你是初学者还是想要巩固基础,这部分内容将帮助你打下扎实的基础。 数据库的定义与作用:什么是数据库?MySQL 与其他数据库系统的比较。MySQL 安装与配置…...

基于单片机的智能校园照明系统
由于校园用电量较大,本设计可以根据实际环境情况的改变,实现实时照明的控制。本设计以单片机芯片为控制芯片,热释电传感器采集教室中学生出入的信息,并把信息传递给单片机芯片,单片机芯片根据传感器传递过来的信息来控…...

高性能分布式搜索引擎Elasticsearch详解
♥️作者:小宋1021 🤵♂️个人主页:小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油!…...

连锁收银系统的五大功能 选择开源收银系统三要素
连锁收银系统的五大功能,很多新手是不清楚的,老手也只是知道一些大概,今天,商淘云为大家分享收银系统的五大功能,尤其是第五个,大部分人不清楚,有的企业前面选了不合适的收银系统,导…...

虚幻引擎解决构建问题
1.Intermediate 文件夹 在 Unreal Engine中,Intermediate 文件夹扮演着构建过程中的临时存储角色。具体来说,Intermediate 文件夹用于存放在编译和构建项目过程中生成的中间文件,这些文件包括但不限于: 编译中间文件:…...

C++基础知识:C++中读文件的四种简单方式
1.读取文件的步骤: 读文件步骤如下: 1.包含头文件 #include <fstream> 2.创建流对象 ifstream ifs; 3.打开文件并判断文件是否打开成功 ifs.open(“文件路径”,打开方式); 4. 读数据 四种方式读取 5.关闭文件 ifs.close(); 读取方法一: #include…...

【人工智能】多模态AI:如何通过融合文本、图像与音频重塑智能系统未来
1. 引言 在人工智能领域,多模态AI 是一项令人兴奋的新兴技术,旨在通过结合文本、图像和音频等多种数据模态,打造更加智能化和人性化的系统。随着深度学习和自然语言处理(NLP)的飞速发展,多模态AI正在为下一…...

通过重写QStyle控制QT控件样式
文章目录 创建自定义 QStyle 子类重写绘制方法调整大小和边距使用自定义样式在Qt应用程序中,QStyle类是负责所有控件(如按钮、滚动条、复选框等)的外观和行为的基类。重写QStyle允许你自定义控件的外观和感觉,实现独特的界面设计。下面介绍一下如何通过重写QStyle控制QT控件的…...

WPF入门教学十八 动画入门
WPF(Windows Presentation Foundation)是微软推出的一种用于创建Windows客户端应用程序的用户界面框架。WPF 提供了丰富的动画支持,可以通过XAML或者代码来实现各种动画效果。以下是一个简单的WPF动画入门教学,我们将使用XAML来创…...