昇思MindSpore学习笔记5--数据变换Transforms

摘要:

昇思MindSpore数据变换,包括通用变换Common Transforms、图像变换Vision Transforms、标准化Normalize文本变换Text Transforms、匿名函数变换Lambda Transforms

一、数据变换Transforms概念

原始数据预处理后才能送入神经网络进行训练

mindspore.dataset.transforms

支持图像、文本、音频等数据类型的数据变换。

支持使用Lambda函数

二、环境准备

安装minspore模块

!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1

导入minspore、dataset等相关模块

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

三、通用变换Common Transforms

mindspore.dataset.transforms模块支持一系列通用Transforms。

下面以Compose为例。

  1. 下载数据集:
# Download data from open datasets

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')

输出:

Downloading data from https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/MNIST_Data.zip (10.3 MB)

file_sizes: 100%|███████████████████████████| 10.8M/10.8M [00:00<00:00, 173MB/s]
Extracting zip file...
Successfully downloaded / unzipped to ./

2.加载训练数据集

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

输出:

(28, 28, 1)

3.数据变换

# 定义compose变换
composed = transforms.Compose(
    [
        vision.Rescale(1.0 / 255.0, 0),
        vision.Normalize(mean=(0.1307,), std=(0.3081,)),
        vision.HWC2CHW()
    ]
)
# 注册compose变换
train_dataset = train_dataset.map(composed, 'image')
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape)

输出:

(1, 28, 28)

四、图像变换Vision Transforms

mindspore.dataset.vision模块提供一系列图像数据变换

下面Mnist数据处理过程中,使用了缩放Rescale、标准化Normalize和格式转换HWC2CHW

1. 缩放Rescale

用于调整图像像素值的大小,包括两个参数:

        Rescale :缩放因子

        Shift       :平移因子

输出的像素值 :outputi=inputi*rescale+shift 

下例使用numpy随机生成一个像素值在[0, 255]的图像。

random_np = np.random.randint(0, 255, (48, 48), np.uint8)
random_image = Image.fromarray(random_np)
print(random_np)

输出:

[[104 213  39 ...  78 181 154]
 [ 65  32 142 ...   3  78 137]
 [166 225   9 ...  75 220 173]
 ...
 [190 134  56 ... 171 213 135]
 [109  57 118 ...   2  78  28]
 [ 86  43  44 ... 186 233 193]]

现在对其像素值进行缩放

rescale = vision.Rescale(1.0 / 255.0, 0)
rescaled_image = rescale(random_image)
print(rescaled_image)

输出:

[[0.40784317 0.8352942  0.15294118 ... 0.30588236 0.70980394 0.6039216 ]
 [0.25490198 0.1254902  0.5568628  ... 0.01176471 0.30588236 0.5372549 ]
 [0.6509804  0.882353   0.03529412 ... 0.29411766 0.86274517 0.6784314 ]
 ...
 [0.74509805 0.5254902  0.21960786 ... 0.67058825 0.8352942  0.5294118 ]
 [0.427451   0.22352943 0.46274513 ... 0.00784314 0.30588236 0.10980393]
 [0.3372549  0.16862746 0.17254902 ... 0.7294118  0.91372555 0.7568628 ]]

2. 标准化Normalize

用于对输入图像的归一化,包括三个参数:

        Mean  :图像每个通道的均值。

        Std      :图像每个通道的标准差。

        is_hwc:bool值,输入图像的格式。

                        True为(height, width, channel)

                        False为(channel, height, width)

图像的每个通道下列公式进行调整,其中c代表通道索引:

normalize = vision.Normalize(mean=(0.1307,), std=(0.3081,))
normalized_image = normalize(rescaled_image)
print(normalized_image)

输出:

[[ 0.8995235   2.286901    0.07218818 ...  0.5685893   1.8795974   1.5359352 ]
 [ 0.40312228 -0.01690946  1.3831964  ... -0.38602826  0.5685893   1.3195552 ]
 [ 1.688674    2.4396398  -0.30965886 ...  0.5304046   2.3759987   1.7777716 ]
 ...
 [ 1.9941516   1.2813705   0.28856817 ...  1.7523152   2.286901   1.2940987 ]
 [ 0.9631647   0.3012964   1.0777187  ... -0.3987565   0.5685893  -0.06782239]
 [ 0.67041516  0.12310111  0.13582934 ...  1.9432386   2.5414658   2.0323365 ]]

3. 格式转换HWC2CHW

MindSpore设置HWC为默认图像格式

不同设备会对(height, width, channel)或(channel, height, width)两种格式针对性优化

将上例的normalized_image处理为HWC格式,转换为CHW

hwc_image = np.expand_dims(normalized_image, -1)
hwc2chw = vision.HWC2CHW()
chw_image = hwc2chw(hwc_image)
print(hwc_image.shape, chw_image.shape)

输出:

(48, 48, 1) (1, 48, 48)

五、文本变换Text Transforms

mindspore.dataset.text模块提供文本数据变换

包括分词(Tokenize)、构建词表、Token转Index等操作

示例:

1. 准备数据

定义三段文本,使用GeneratorDataset加载。

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

2. 分词

MindSpore提供多种分词器,此处选用PythonTokenizer,可以自由实现分词策略。

用map注册分词操作。

def my_tokenizer(content):
    return content.split()

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

输出:

[Tensor(shape=[3], dtype=String, value= ['Welcome', 'to', 'Beijing'])]

3. 词表映射变换Lookup

为每个分词建立索引

使用Vocab生成词表,用vocab方法查看词表

vocab = text.Vocab.from_dataset(test_dataset)
print(vocab.vocab())

输出:

{'to': 2, 'Welcome': 1, 'Beijing': 0}

配合map方法进行词表映射变换,为分词建立索引

test_dataset = test_dataset.map(text.Lookup(vocab))
print(next(test_dataset.create_tuple_iterator()))

输出:

[Tensor(shape=[3], dtype=Int32, value= [1, 2, 0])]

六、匿名函数变换Lambda Transforms

Lambda是匿名函数。

Lambda Transforms加载定义Lambda函数

下例的Lambda函数实现对输入数据乘2

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()))

输出:

[[Tensor(shape=[], dtype=Int64, value= 6)], [Tensor(shape=[], dtype=Int64, value= 18)], [Tensor(shape=[], dtype=Int64, value= 38)]]

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

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

相关文章

【网络】计算机网络-基本知识

目录 概念计算机网络功能计算机网络的组成计算机网络的分类 网络地址网络地址的分类 计算机网络相关性能指标速率带宽吞吐量时延时延的种类&#xff1a; 时延带宽积往返时延RTT利用率 概念 计算机网络是指将多台计算机通过通信设备连接起来&#xff0c;实现数据和资源的共享。…

spring mvc实现一个自定义Formatter请求参数格式化

使用场景 在Spring Boot应用中&#xff0c;Formatter接口用于自定义数据的格式化&#xff0c;比如将日期对象格式化为字符串&#xff0c;或者将字符串解析回日期对象。这在处理HTTP请求和响应时特别有用&#xff0c;尤其是在展示给用户或从用户接收特定格式的数据时。下面通过…

Arthas快速入门

简介 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类…

3.3V到5V的负电源产生电路(电荷泵电压反相器)SGM3204输出电流0.2A封装SOT23-6

前言 SGM3204 非稳压 200mA 电荷泵负电源产生电路&#xff0c;LCEDA原理图请访问资源 SGM3204电荷泵负电源产生电路 SGM3204电荷泵负电源产生电路 一般描述 SGM3204从 1.4V 至 5.5V 的输入电压范围产生非稳压负输出电压。 该器件通常由 5V 或 3.3V 的预稳压电源轨供电。由于…

ElementUI的基本搭建

目录 1&#xff0c;首先在控制终端中输入下面代码&#xff1a;npm i element-ui -S 安装element UI 2&#xff0c;构架登录页面&#xff0c;login.vue​编辑 3&#xff0c;在官网获取对应所需的代码直接复制粘贴到对应位置 4&#xff0c;在继续完善&#xff0c;从官网添加…

OverTheWire Bandit 靶场通关解析(中)

介绍 OverTheWire Bandit 是一个针对初学者设计的网络安全挑战平台&#xff0c;旨在帮助用户掌握基本的命令行操作和网络安全技能。Bandit 游戏包含一系列的关卡&#xff0c;每个关卡都需要解决特定的任务来获取进入下一关的凭证。通过逐步挑战更复杂的问题&#xff0c;用户可…

14-7 为什么你的梦想职业可能会扼杀你的梦想

照片由Johnny Cohen在Unsplash拍摄 “做好工作的唯一方法就是热爱你所做的事情。如果你还没有找到&#xff0c;那就继续寻找。不要安于现状。”——史蒂夫乔布斯 等一下&#xff0c;什么&#xff1f; 这不是一篇关于无聊工作的文章吗&#xff1f;我为什么要用一句完全违背前提…

windows@文件高级共享设置@网络发现功能@从资源管理器网络中访问远程桌面

文章目录 高级共享设置常用选项其他选项操作界面说明 网络类型检查和设置(专用网络和公用网络)&#x1f47a;Note 高级共享设置和防火墙&#x1f47a;命令行方式使用图形界面方式配置 网络发现网络发现功能的详细介绍网络发现的作用&#x1f47a;网络发现的工作原理启用和配置网…

Vulnhub-AdmX

主机发现 靶机 &#xff1a; 192.168.145.131131 这台主机 存活 端口扫描 nmap -sV -O -p 1-65535 192.168.145.131 存在 80 端口 &#xff0c;这里连ssh 端口都没了 80 端口存在 Apache httpd 2.4.1 存在 Apache 默认页面 像这种页面 &#xff0c;没有什么具体的价值 扫描一…

Linux的fwrite函数

函数原型: 向文件fp中写入writeBuff里面的内容 int fwrite(void*buffer&#xff0c;intsize&#xff0c;intcount&#xff0c;FILE*fp) /* * description : 对已打开的流进行写入数据块 * param ‐ ptr &#xff1a;指向 数据块的指针 * param ‐ size &#xff1a;指定…

Webpack: 开发 PWA、Node、Electron 应用

概述 毋庸置疑&#xff0c;对前端开发者而言&#xff0c;当下正是一个日升月恒的美好时代&#xff01;在久远的过去&#xff0c;Web 页面的开发技术链条非常原始而粗糙&#xff0c;那时候的 JavaScript 更多用来点缀 Web 页面交互而不是用来构建一个完整的应用。直到 2009年5月…

Transformer教程之序列到序列模型(Seq2Seq)

在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;Transformer模型无疑是近年来最具革命性的方法之一。它的出现不仅大大提高了机器翻译、文本生成等任务的精度&#xff0c;还推动了整个深度学习研究的进步。本文将详细介绍Transformer模型中的序列到序列模型&am…

Redisson(分布式锁、限流)

注意Redisson是基于Redis的&#xff0c;所以必须先引入Redis配置&#xff08;参考SpringBoot集成Redis文章&#xff09; 1. 集成Redisson 引入依赖 <!-- 二选一,区别是第一个自动配置&#xff0c;第二个还需要手动配置也就是第二步自定义配置&#xff0c;注意版本号&…

Java对应C++ STL的用法

sort&#xff1a; 1&#xff1a;java.util.Arrays中的静态方法Arrays.sort()方法&#xff0c;针对基本数据类型和引用对象类型的数组元素排序 2&#xff1a;java.util.Collections中的静态方法的Collections.sort()方法&#xff0c;针对集合框架中的动态数组&#xff0c;链表&…

【mysql的行记录格式】

记录头信息 除了变长字段长度列表、NULL值列表之外&#xff0c;还有一个用于描述记录的记录头信息&#xff0c;它是由固定的5个字节组成。5个字节也就是40个二进制位&#xff0c;不同的位代表不同的意思&#xff0c;如图&#xff1a; 记录的真实数据 对于record_format_demo表来…

linux中的各种指令

按文件的大小进行查找 find / usr -size 100M 在home路径下创建txt文件 touch test.txt 查看test.txt文件中的内容&#xff1a; cat test.txt通过指令pwd可以查看当前所处路径。 切换超级用户的指令&#xff1a; su - root 离开时可以使用指令&#xff1a;exit grep指…

.net 项目中配置 Swagger

一、前言 二、Swagger 三、.net 项目中添加Swagger 1、准备工作 &#xff08;1&#xff09;.net项目 &#xff08;2&#xff09;SwaggerController &#xff08;3&#xff09;XML文档注释 2、安装Swagger包 3、 添加配置swagger中间件 &#xff08;1&#xff09;添加S…

深入理解Unix/Linux中sync、fsync、fdatasync和sync_file_range系统调用以及他们的区别

前言 在linux内核中都有缓冲区或者页面高速缓存&#xff0c;大多数磁盘IO都是通过缓冲写的。当你想将数据write进文件时&#xff0c;内核通常会将该数据复制到其中一个缓冲区中&#xff0c;如果该缓冲没被写满的话&#xff0c;内核就不会把它放入到输出队列中。当这个缓冲区被…

5000字深入讲解:企业数字化转型优先从哪个板块开始?

很多企业都知道数字化转型重要&#xff0c;但不知道应该怎样入手&#xff0c;分哪些阶段。以下引用国内领先数字化服务商 织信Informat 的数字化转型方法论材料&#xff0c;且看看他们是如何看待数字化转型的&#xff1f;数字化转型应该从哪先开始&#xff1f;如何做&#xff1…

编译工具-Gradle

文章目录 Idea中配置Gradle项目project目录settings.gradlebuild.gradlegradlewgradlew.bat Gradle Build生命周期编写Settings.gradle编写Build.gradleTasksPlugins Idea中配置 配置项&#xff1a;gradle位置 及仓库位置 Gradle项目 Task&#xff0c;settings.gradle,build.…