昇思25天学习打卡营第4天|MindSpore数据集和数据变换

# 打卡

目录

# 打卡

Dateset:Pipeline 的起始

具体步骤

数据处理 Pipeline

代码例子

内置数据集的情况

自定义数据集的情况

可迭代的数据集

生成器

Transforms:数据预处理

代码例子

通用变换Compose

文本变换 Text

Lambda变换


Dateset:Pipeline 的起始

mindspore.dataset — MindSpore master 文档

MindSpore Dataset 是所有数据集的基类,提供了数据处理方法来帮助用户很简便地定义数据预处理Pipeline,并以最高效(多进程/多线程)的方式处理数据集中的样本。 可用于数据集加载、迭代、操作。

具体步骤

  1. 加载数据集:1)用 *Dataset 类来加载已支持的数据集;2)通过 UDF Loader + GeneratorDataset 实现Python层自定义数据集的加载。// mindspore.dataset提供的接口仅支持解压后的数据文件,可用download库下载数据集并解压。
  2. 数据集操作:通过数据集对象方法 .shuffle / .filter / .skip / .split / .take / … 来实现数据集的进一步混洗、过滤、跳过、最多获取条数等操作。
  3. 数据集样本增强操作:将数据增强操作 (vision类 , nlp类 , audio类 ) 添加到map操作中执行,数据预处理过程中可以定义多个map操作,用于执行不同增强操作,数据增强操作也可以是 用户自定义增强的 PyFunc ;
  4. 批:用 .batch 操作将多个样本组织成batch,也可以通过batch的参数 per_batch_map 来自定义batch逻辑;
  5. 迭代器:通过数据集对象方法 create_tuple_iterator或create_dict_iterator 接口来创建迭代器, 可以将预处理完成的数据循环输出。

数据处理 Pipeline

  • 内置开源数据集分为视觉、文本、音频类。
  • 内置数据格式分为标准格式、用户自定义等。
  • 内置其他数据集处理接口,如采样器模块、全局配置模块等。

例如,视觉类(Cifar10Dataset、Cifar100Dataset、FashionMnistDataset、Food101Dataset、KITTIDataset、MnistDataset、QMnistDataset、VOCDataset、WIDERFaceDataset 等),文本类(AGNewsDataset、CLUEDataset、DBpediaDataset、IMDBDataset、SQuADDataset、TextFileDataset、WikiTextDataset、YahooAnswersDataset、YelpReviewDataset 等),音频类(CMUArcticDataset、GTZANDataset、LibriTTSDataset、LJSpeechDataset、SpeechCommandsDataset、TedliumDataset、YesNoDataset 等)。

例如,标准格式(CSVDataset、MindDataset、OBSMindDataset、TFRecordDataset ),用户自定义格式(GeneratorDataset、NumpySlicesDataset、PaddedDataset、RandomDataset)

  • map操作可以针对数据集指定列(column)添加数据变换(Transforms),将数据变换应用于该列数据的每个元素,并返回包含变换后元素的新数据集。
  • batch操作可以将数据集打包为固定大小的batch,是在有限硬件资源下使用梯度下降进行模型优化的折中方法,可以保证梯度下降的随机性和优化计算量。

代码例子

内置数据集的情况

import numpy as np
from mindspore.dataset import vision
from mindspore.dataset import MnistDataset, GeneratorDataset
import matplotlib.pyplot as plt
from download import download

url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/MNIST_Data.zip"
path = download(url, "./", kind="zip", replace=True)

train_dataset = MnistDataset("MNIST_Data/train", shuffle=False)
print(type(train_dataset))

def visualize(dataset):
    figure = plt.figure(figsize=(4, 4))
    cols, rows = 4, 3

    plt.subplots_adjust(wspace=0.5, hspace=0.5)

    for idx, (image, label) in enumerate(dataset.create_tuple_iterator()):
        figure.add_subplot(rows, cols, idx + 1)
        plt.title(int(label))
        plt.axis("off")
        plt.imshow(image.asnumpy().squeeze(), cmap="gray")
        if idx == cols * rows - 1:
            break
    plt.show()


### shuffle
train_dataset = train_dataset.shuffle(buffer_size=64)
visualize(train_dataset)

### 迭代访问
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype, label)
plt.imshow(image.asnumpy().squeeze(), cmap="gray")

### 数据缩放处理map
train_dataset = train_dataset.map(vision.Rescale(1.0 / 255.0, 0), input_columns='image')
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype, label)
plt.imshow(image.asnumpy().squeeze(), cmap="gray")

### batch打包数据
train_dataset = train_dataset.batch(batch_size=32)
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)   ## 32个打包图片

自定义数据集的情况

下面自定义的可随机访问数据集是实现了 `__getitem__` 和 `__len__` 方法的数据集,表示可以通过索引/键直接访问对应位置的数据样本。

import numpy as np
from mindspore.dataset import vision
from mindspore.dataset import MnistDataset, GeneratorDataset
import matplotlib.pyplot as plt

# Random-accessible object as input source
class RandomAccessDataset:
    def __init__(self):
        self._data = np.ones((5, 2))
        self._label = np.zeros((5, 1))

    def __getitem__(self, index):
        return self._data[index], self._label[index]

    def __len__(self):
        return len(self._data)


loader = RandomAccessDataset()
dataset = GeneratorDataset(source=loader, column_names=["data", "label"])

for data in dataset:
    print(data)

# list, tuple are also supported.
loader = [np.array(0), np.array(1), np.array(2)]
dataset = GeneratorDataset(source=loader, column_names=["data"])

for data in dataset:
    print(data)

可迭代的数据集

可迭代的数据集是实现了__iter____next__方法的数据集,表示可以通过迭代的方式逐步获取数据样本。这种类型的数据集特别适用于随机访问成本太高或者不可行的情况。

from mindspore.dataset import vision
from mindspore.dataset import GeneratorDataset

# Iterator as input source
class IterableDataset():
    def __init__(self, start, end):
        '''init the class object to hold the data'''
        self.start = start
        self.end = end
    def __next__(self):
        '''iter one data and return'''
        return next(self.data)
    def __iter__(self):
        '''reset the iter'''
        self.data = iter(range(self.start, self.end))
        return self


loader = IterableDataset(1, 5)
dataset = GeneratorDataset(source=loader, column_names=["data"])

for d in dataset:
    print(d)

生成器

生成器也属于可迭代的数据集类型,其直接依赖Python的生成器类型generator返回数据,直至生成器抛出StopIteration异常。

from mindspore.dataset import vision
from mindspore.dataset import GeneratorDataset

# Generator
def my_generator(start, end):
    for i in range(start, end):
        yield i


# since a generator instance can be only iterated once, we need to wrap it by lambda to generate multiple instances
dataset = GeneratorDataset(source=lambda: my_generator(3, 6), column_names=["data"])

for d in dataset:
    print(d)

Transforms:数据预处理

mindspore.dataset.transforms — MindSpore master 文档

在数据送入模型网络训练前进行的数据预处理操作。

MindSpore Dataset支持的不同变换类型的数据变换,配合数据处理Pipeline来实现数据预处理。所有的Transforms均可通过 map 方法传入,实现对指定数据列的处理。

代码例子

通用变换Compose

Compose接收一个数据增强操作序列,然后将其组合成单个数据增强操作。

下面代码的Compose包括了三个vision视觉变换过程, vision.Rescale、 vision.Normalize、vision.HWC2CHW。

  • Rescale 变换作用分别:用于调整图像像素值的大小,图像的每个像素将根据这rescale缩放因子、shift平移因子两个参数进行调整。输出的像素值为 output_{i} = input_{i} * rescale + shift
  • Normalize变换用于对输入图像的归一化。图像的每个通道将根据meanstd进行调整,output_c = (input_c - mean_c) / std_c,其中 c 代表通道索引。
  • HWC2CHW变换用于转换图像格式。在不同的硬件设备中可能会对(height, width, channel)或(channel, height, width)两种不同格式有针对性优化。MindSpore设置 HWC 为默认图像格式,在有CHW格式需求时,可使用该变换进行处理。
import numpy as np
from PIL import Image
from download import download
from mindspore.dataset import transforms, vision, text
from mindspore.dataset import GeneratorDataset, MnistDataset
import matplotlib.pyplot as plt


train_dataset = MnistDataset('MNIST_Data/train')

image, label = next(train_dataset.create_tuple_iterator())
print(image.shape)


composed = transforms.Compose(
    [
        vision.Rescale(1.0 / 255.0, 0),
        vision.Normalize(mean=(0.1307,), std=(0.3081,)),
        vision.HWC2CHW()
    ]
)

train_dataset = train_dataset.map(composed, 'image')
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape)

plt.imshow(image.asnumpy().squeeze(), cmap="gray")

文本变换 Text

mindspore.dataset.transforms — MindSpore master 文档

针对文本数据的Transforms 与图像数据不同,文本数据需要有分词(Tokenize)、构建词表、Token转Index等操作。

  • MindSpore提供多种不同的Tokenizer,以PythonTokenizer举例,它允许用户自由实现分词策略。
  • Lookup为词表映射变换,用来将Token转换为Index。需要先构造词表,这里Vocab.from_dataset 方法从数据集中生成词表。
from mindspore.dataset import transforms, vision, text
from mindspore.dataset import GeneratorDataset, 

def my_tokenizer(content):
    ## 空格分词
    return content.split()


texts = ['Welcome to Beijing']
test_dataset = GeneratorDataset(texts, 'text')

test_dataset = test_dataset.map(text.PythonTokenizer(my_tokenizer))
print(next(test_dataset.create_tuple_iterator()))


### 词表构造
vocab = text.Vocab.from_dataset(test_dataset)
print(vocab.vocab())   ## 用vocab方法查看词表。

### 词表映射变换
test_dataset = test_dataset.map(text.Lookup(vocab))
print(next(test_dataset.create_tuple_iterator()))

Lambda变换

Lambda函数是一种不需要名字、由一个单独表达式组成的匿名函数,表达式会在调用时被求值。

from mindspore.dataset import transforms, vision, text
from mindspore.dataset import GeneratorDataset


test_dataset = GeneratorDataset([1, 2, 3], 'data', shuffle=False)
test_dataset = test_dataset.map(lambda x: x * 2)
print(list(test_dataset.create_tuple_iterator()))

def func(x):
    return x * x + 2

test_dataset = test_dataset.map(lambda x: func(x))
print(list(test_dataset.create_tuple_iterator()))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/780875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ExtruOnt——为工业 4.0 系统描述制造机械类型的本体

概述 论文地址 :https://arxiv.org/abs/2401.11848 原文地址:https://ai-scholar.tech/articles/ontology/ExtruOnt 在工业 4.0 应用场景中,以机器可解释代码提供的、语义丰富的制造机械描述可以得到有效利用。然而,目前显然还缺…

【开源项目】LocalSend 局域网文件传输工具

【开源项目】LocalSend 局域网文件传输工具 一个免费、开源、跨平台的局域网传输工具 LocalSend 简介 LocalSend 是一个免费的开源跨平台的应用程序,允许用户在不需要互联网连接的情况下,通过本地网络安全地与附近设备共享文件和消息。 项目地址&…

​RAG与LLM原理及实践(8)--- Chroma 应用场景及限制

前言 通过前面几节的介绍,你应该对Chroma的运作原理有相当透彻的理解。Chroma的设计正如之前描述的: Chroma提供的工具: 存储文档数据和它们的元数据:store embeddings and their metadata 嵌入:embed documents an…

.mkp勒索病毒:深度解析与防范

引言: 在数字化时代,网络安全问题日益严峻,其中勒索病毒作为一种极具破坏性的恶意软件,严重威胁着个人用户和企业机构的数据安全。在众多勒索病毒家族中,.mkp勒索病毒以其强大的加密能力和广泛的传播方式,成…

Amesim中删除计算结果保存计算文件

前言 Amesim在工程应用中计算的结果文件有时会很大,为了节省电脑存储空间,项目结束后可以将计算结果删除进行保存以存档。 操作步骤 具体操作步骤如下: Step1:在①File下打开(Open)需要删除计算结果的项…

PyQt5开发笔记:2. 2D与3D散点图、水平布局和边框修饰

一、装pyqtgraph和PyOpenGL库 pip install pyqtgraph pip install PyOpenGL 注意:一定不要pip install OpenGL,否则会找不到 二、3D散点图效果 import pyqtgraph as pg import pyqtgraph.opengl as gl import numpy as np# 创建应用程序 app pg.mkQ…

《机器学习》读书笔记:总结“第4章 决策树”中的概念

💠决策树 基于树结构进行决策。 一棵决策树包括: 一个 根节点(起点)若干 叶节点(没有下游节点的节点)若干 内部节点(分支节点) 即: #mermaid-svg-Mxe3d0kNg29PM2n8 {font-family:"treb…

leetcode每日一题-3101 交替子数组计数

暴力遍历&#xff1a;看起来像是回溯,实际上就是递归 class Solution { private:long long _res 0; public:long long countAlternatingSubarrays(vector<int>& nums) {backtrack(nums, 0);return _res;}void backtrack(vector<int>& nums, long long st…

黑马|最新AI+若依 |初识项目

本章主要内容是&#xff1a; 1.快速搭建了若依前后端项目在本地 2.实现了单表的增删改查快速生成 文章目录 介绍1.若依介绍2.若依的不同版本3.项目运行环境 初始化前后端项目1.下载若依项目2.初始化后端a.把表导入到数据库中b.更改application.yml文件 3.初始化前端a.安装依赖…

【游戏引擎之路】登神长阶(六)——雅达利2600汇编学习,任天堂居然还真不是抄袭起家

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7…

基于海思Hi3403V100方案开发双目1600万拼接相机测试截图

海思Hi3403V100平台SOC内置四核A55&#xff0c;提供高效且丰富和灵活的CPU资源&#xff0c;以满足客户计算和控制需求&#xff0c;并且集成单核MCU&#xff0c;已满足一些低延时要求较高场景。 多目相机PE108CB板是针对该芯片设计的一款多目凭借相机PCBA&#xff0c;硬件接口支…

node.js_HTTP协议

Hypertext Transfer Protocol 超文本传输协议 1.HTTP报文 请求行 请求头 请求体 它的内容形式很灵活&#xff0c;可以设置任意内容 2.HTTP响应报文 响应状态码 响应状态的描述 遇到陌生的状态码可以参考一下这个网址&#xff1a; https://developer.mozilla.org/zh-C…

期末成绩发布方式

期末考试结束后&#xff0c;成绩单的发放总是让老师们头疼不已。想象一下&#xff0c;每个学生的成绩都需要老师一个个私信给家长&#xff0c;不仅耗时耗力&#xff0c;而且极易出错。 在传统的成绩单发放方式中&#xff0c;老师往往需要通过电子邮件、短信或者微信等方式&…

python爬虫入门(一)之HTTP请求和响应

一、爬虫的三个步骤&#xff08;要学习的内容&#xff09; 1、获取网页内容 &#xff08;HTTP请求、Requests库&#xff09; 2、解析网页内容 &#xff08;HTML网页结构、Beautiful Soup库&#xff09; 3、存储或分析数据 b站学习链接&#xff1a; 【【Python爬虫】爆肝两…

数据合并 26-30题(30 天 Pandas 挑战)

数据合并 1. 知识点1.27 左连接1.28 数据填充与交叉连接1.29 获取列值列表 题目2.26 合作过至少三次的演员和导演2.27 使用唯一标识码替换员工ID2.28 学生们参加各科测试的次数2.29 至少有5名直接下属的经理2.30 销售员 1. 知识点 1.27 左连接 datapd.merge(employees,employ…

什么是五级流水?银行眼中的“好流水”,到底是什么样的?

无论是按揭买房还是日常贷款&#xff0c;银行流水都是绕不开的一环。规划好你的流水&#xff0c;不仅能让你在申请贷款时更有底气&#xff0c;还可能帮你省下不少冤枉钱。今天&#xff0c;咱们就来一场深度剖析&#xff0c;聊聊如何在按揭贷款、个人经营抵押贷款前&#xff0c;…

什么是SysTick?

一&#xff0c;滴答定时器SysTick SysTick&#xff0c;即滴答定时器&#xff0c;是内核中一个特殊的定时器&#xff0c;用于提供系统级的定时服务。是一个24位递减计时器&#xff0c;具有自动重载值寄存器的功能 。当计数器到达自动重载值时&#xff0c;它会自动重新加载新的计…

深入探索Python库的奇妙世界:赋能编程的无限可能

在编程的浩瀚宇宙中&#xff0c;Python以其简洁的语法、强大的功能和广泛的应用领域&#xff0c;成为了众多开发者心中的璀璨明星。而Python之所以能够如此耀眼&#xff0c;很大程度上得益于其背后庞大的库生态系统。这些库&#xff0c;如同一块块精心雕琢的积木&#xff0c;让…

【Linux详解】进程等待 | 非阻塞轮询

引入&#xff1a; 为什么&#xff1f;是什么&#xff1f;怎么办 是什么&#xff1f; 进程等待是指父进程暂停自己的执行&#xff0c;直到某个特定的子进程结束或发生某些特定的事件。 为什么&#xff1f; 僵尸进程刀枪不入&#xff0c;不可被杀死&#xff0c;存在内存泄露…

安卓备忘录App开发

安卓备忘录APP开发,文章末尾有源码和apk安装包 目标用户: 普通安卓手机用户,需要一个简单易用的备忘录App来记录和管理日常事务。 主要功能: 用户注册: 用户可以创建一个账号,输入用户名和密码。 用户登录: 用户可以通过用户名和密码登录到应用。 用户信息存储: 用户名和…