《昇思25天学习打卡营第04天|qingyun201003》

日期

image.png

心得

从中认识到什么是数据转换,如何进行数据转换;对于数据转换应该如何理解。同时对于数据转换的代码有了深层次的理解。对于数据增强、转换、归一化有了明确的认知。

昇思MindSpore 基础入门学习 数据转换 (AI 代码解析)

数据变换 Transforms

通常情况下,直接加载的原始数据并不能直接送入神经网络进行训练,此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换(Transforms),配合数据处理Pipeline来实现数据预处理。所有的Transforms均可通过map方法传入,实现对指定数据列的处理。
mindspore.dataset提供了面向图像、文本、音频等不同数据类型的Transforms,同时也支持使用Lambda函数。下面分别对其进行介绍。

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
  1. import numpy as np:
    • numpy: 这是一个强大的数值计算库,广泛用于数组操作和数学运算。
    • np: 这是 numpy 的别名,方便在代码中使用。
  2. from PIL import Image:
    • PIL: Python Imaging Library (PIL) 是一个图像处理库,现在被 Pillow 项目继承和扩展。
    • Image: Image 模块提供了图像处理的基本功能,如打开、保存和编辑图像。
  3. from download import download:
    • download: 这个模块或函数可能用于从网络下载文件。具体功能取决于 download 模块的实现。
  4. from mindspore.dataset import transforms, vision, text:
    • mindspore.dataset: MindSpore 是一个深度学习框架,dataset 模块提供了数据集处理的相关功能。
    • transforms: 这个模块提供了数据预处理和数据增强的转换函数。
    • vision: 这个模块提供了图像相关的数据处理和增强功能。
    • text: 这个模块提供了文本数据处理的功能。
  5. from mindspore.dataset import GeneratorDataset, MnistDataset:
    • GeneratorDataset: 这是一个数据集类,用于从生成器创建数据集。生成器可以是一个函数,用于动态生成数据。
    • MnistDataset: 这是一个预定义的数据集类,用于加载和处理 MNIST 数据集,MNIST 是一个手写数字图像数据集,常用于机器学习模型的训练和测试。

这些导入语句为后续的代码提供了必要的工具和功能,以便进行数据处理、图像处理和深度学习模型的训练。

Common Transforms

mindspore.dataset.transforms模块支持一系列通用Transforms。这里我们以Compose为例,介绍其使用方式。

Compose

Compose接收一个数据增强操作序列,然后将其组合成单个数据增强操作。我们仍基于Mnist数据集呈现Transforms的应用效果。

from download import download
from mindspore.dataset import MnistDataset# 定义数据集的URL
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')
  1. download** 函数**:
    • url: 数据集的下载链接。
    • “./”: 下载文件的保存路径,这里表示当前目录。
    • kind=“zip”: 指定下载的文件类型为ZIP压缩文件。
    • replace=True: 如果目标路径已存在同名文件,则替换它。
  2. MnistDataset** 类**:
    • ‘MNIST_Data/train’: 指定MNIST训练数据集的路径。这个路径是基于下载和解压后的文件结构。

通过这段代码,你可以从指定的URL下载MNIST数据集的ZIP文件,并将其解压到当前目录。然后,使用MnistDataset类加载解压后的训练数据集。

image, label = next(train_dataset.create_tuple_iterator())
print(image.shape)
  1. train_dataset.create_tuple_iterator():
    • create_tuple_iterator: 这是一个数据集方法,用于创建一个迭代器,该迭代器可以逐个返回数据集中的元素。每个元素是一个元组,包含图像和对应的标签。
  2. next** 函数**:
    • next: 这是一个内置函数,用于从迭代器中获取下一个元素。在这里,它获取训练数据集中的第一个元素,即一个图像和对应的标签。
  3. image.shape:
    • image: 这是一个NumPy数组,表示从数据集中获取的图像。
    • shape: 这是NumPy数组的属性,返回数组的形状,即维度信息。例如,如果图像的形状是 (1, 28, 28),表示这是一个单通道的28x28像素图像。

通过这段代码,你可以获取训练数据集中的第一个图像及其形状信息,并打印出来。这对于验证数据集的加载和预处理是否正确非常有用。

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)
  1. transforms.Compose:
    • Compose: 这是一个组合多个数据增强操作的类。它接收一个操作序列,并将其组合成单个操作。这样可以在数据集上一次性应用多个增强操作。
  2. 数据增强操作序列:
    • vision.Rescale: 将图像的像素值从原始的[0, 255]缩放到[0, 1]范围内。参数 1.0 / 255.0 用于缩放,0 是偏移量。
    • vision.Normalize: 对图像进行标准化处理,使其均值为0,标准差为1。参数 mean=(0.1307,)std=(0.3081,) 分别是均值和标准差。
    • vision.HWC2CHW: 将图像的通道顺序从 “Height-Width-Channel” (HWC) 转换为 “Channel-Height-Width” (CHW)。这是为了适应一些深度学习模型的输入要求。
  3. train_dataset.map:
    • map: 这是一个数据集方法,用于对数据集中的每个元素应用指定的操作。参数 composed 指定要应用的操作,'image' 指定要应用操作的列(这里是图像列)。
  4. train_dataset.create_tuple_iterator():
    • create_tuple_iterator: 这是一个数据集方法,用于创建一个迭代器,该迭代器可以逐个返回数据集中的元素。每个元素是一个元组,包含图像和对应的标签。
  5. next** 函数**:
    • next: 这是一个内置函数,用于从迭代器中获取下一个元素。在这里,它获取训练数据集中的第一个元素,即一个图像和对应的标签。
  6. image.shape:
    • image: 这是一个NumPy数组,表示从数据集中获取的图像。
    • shape: 这是NumPy数组的属性,返回数组的形状,即维度信息。例如,如果图像的形状是 (1, 28, 28),表示这是一个单通道的28x28像素图像。

通过这段代码,你可以对训练数据集中的图像进行一系列的数据增强操作,并获取处理后的图像及其形状信息,并打印出来。这对于验证数据集的加载和预处理是否正确非常有用。

Vision Transforms

mindspore.dataset.vision模块提供一系列针对图像数据的Transforms。在Mnist数据处理过程中,使用了RescaleNormalizeHWC2CHW变换。下面对其进行详述。

Rescale

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

  • rescale:缩放因子。
  • shift:平移因子。

图像的每个像素将根据这两个参数进行调整,输出的像素值为outputi=inputi∗rescale+shift𝑜𝑢𝑡𝑝𝑢𝑡𝑖=𝑖𝑛𝑝𝑢𝑡𝑖∗𝑟𝑒𝑠𝑐𝑎𝑙𝑒+𝑠ℎ𝑖𝑓𝑡。
这里我们先使用numpy随机生成一个像素值在[0, 255]的图像,将其像素值进行缩放。

import numpy as np
from PIL import Image# 随机生成一个像素值在[0, 255]的48x48图像
random_np = np.random.randint(0, 255, (48, 48), np.uint8)# 将NumPy数组转换为PIL图像
random_image = Image.fromarray(random_np)# 打印生成的随机图像的NumPy数组
print(random_np)
  1. numpy.random.randint:
    • randint: 这是一个NumPy函数,用于生成指定范围内的随机整数。这里生成一个48x48的图像,像素值在[0, 255]之间。
  2. Image.fromarray:
    • fromarray: 这是PIL库中的一个函数,用于将NumPy数组转换为PIL图像对象。
  3. 打印生成的随机图像的NumPy数组:
    • print(random_np): 打印生成的随机图像的NumPy数组,显示图像的像素值。

通过这段代码,你可以生成一个随机图像,并将其转换为PIL图像对象,同时打印出图像的NumPy数组表示。这对于验证图像生成和转换是否正确非常有用。

为了更直观地呈现Transform前后的数据对比,我们使用Transforms的Eager模式进行演示。首先实例化Transform对象,然后调用对象进行数据处理。

from mindspore.dataset import vision
from PIL import Image
import numpy as np# 随机生成一个像素值在[0, 255]的48x48图像
random_np = np.random.randint(0, 255, (48, 48), np.uint8)
random_image = Image.fromarray(random_np)# 创建Rescale变换
rescale = vision.Rescale(1.0 / 255.0, 0)# 应用Rescale变换
rescaled_image = rescale(random_image)# 打印缩放后的图像
print(rescaled_image)
  1. vision.Rescale:
    • Rescale: 这是MindSpore的vision模块中的一个变换,用于调整图像像素值的大小。参数 1.0 / 255.0 是缩放因子,0 是平移因子。
  2. 应用Rescale变换:
    • rescale(random_image): 将Rescale变换应用到生成的PIL图像上,返回缩放后的图像。
  3. 打印缩放后的图像:
    • print(rescaled_image): 打印缩放后的图像。需要注意的是,rescaled_image 是一个NumPy数组,因此打印出来的是数组的表示形式。

由于 rescaled_image 是一个NumPy数组,直接打印它将显示数组的值。如果你希望查看图像的像素范围或形状,可以使用以下代码:

print("Rescaled image shape:", rescaled_image.shape)
print("Rescaled image pixel range:", np.min(rescaled_image), np.max(rescaled_image))

这样可以更清楚地看到缩放后的图像的形状和像素值范围。

为了更直观地呈现Transform前后的数据对比,我们使用Transforms的Eager模式进行演示。首先实例化Transform对象,然后调用对象进行数据处理。

from mindspore.dataset import vision
from PIL import Image
import numpy as np# 随机生成一个像素值在[0, 255]的48x48图像
random_np = np.random.randint(0, 255, (48, 48), np.uint8)
random_image = Image.fromarray(random_np)# 创建Rescale变换
rescale = vision.Rescale(1.0 / 255.0, 0)# 应用Rescale变换
rescaled_image = rescale(random_image)# 打印缩放后的图像
print(rescaled_image)
  1. vision.Rescale:
    • Rescale: 这是MindSpore的vision模块中的一个变换,用于调整图像像素值的大小。参数 1.0 / 255.0 是缩放因子,0 是平移因子。
  2. 应用Rescale变换:
    • rescale(random_image): 将Rescale变换应用到生成的PIL图像上,返回缩放后的图像。需要注意的是,rescale 变换期望输入是一个NumPy数组,而不是PIL图像对象。因此,这段代码可能会抛出错误。
  3. 打印缩放后的图像:
    • print(rescaled_image): 打印缩放后的图像。由于 rescaled_image 是一个NumPy数组,直接打印它将显示数组的值。

Normalize

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

  • mean:图像每个通道的均值。
  • std:图像每个通道的标准差。
  • is_hwc:bool值,输入图像的格式。True为(height, width, channel),False为(channel, height, width)。

图像的每个通道将根据meanstd进行调整,计算公式为outputc=inputc−meancstdc𝑜𝑢𝑡𝑝𝑢𝑡𝑐=𝑖𝑛𝑝𝑢𝑡𝑐−𝑚𝑒𝑎𝑛𝑐𝑠𝑡𝑑𝑐,其中 c𝑐代表通道索引。

from mindspore.dataset import vision
from PIL import Image
import numpy as np# 随机生成一个像素值在[0, 255]的48x48图像
random_np = np.random.randint(0, 255, (48, 48), np.uint8)
random_image = Image.fromarray(random_np)# 将PIL图像转换为NumPy数组
random_np = np.array(random_image)# 创建Rescale变换
rescale = vision.Rescale(1.0 / 255.0, 0)# 应用Rescale变换
rescaled_image = rescale(random_np)# 定义归一化的均值和标准差
mean = (0.1307,)
std = (0.3081,)# 创建Normalize变换
normalize = vision.Normalize(mean=mean, std=std)# 应用Normalize变换
normalized_image = normalize(rescaled_image)# 打印归一化后的图像
print(normalized_image)
  1. vision.Normalize:
    • Normalize: 这是MindSpore的vision模块中的一个变换,用于对图像进行归一化处理。参数 meanstd 分别是图像每个通道的均值和标准差。在这个例子中,meanstd 都是单元素元组,适用于单通道图像(例如灰度图像)。
  2. 应用Normalize变换:
    • normalize(rescaled_image): 将Normalize变换应用到缩放后的图像上,返回归一化后的图像。归一化的计算公式为 output_c = (input_c - mean_c) / std_c,其中 c 代表通道索引。
  3. 打印归一化后的图像:
    • print(normalized_image): 打印归一化后的图像。由于 normalized_image 是一个NumPy数组,直接打印它将显示数组的值。

请注意,rescaled_image 是一个单通道的灰度图像,因此 meanstd 都是单元素元组。如果你的图像是多通道的(例如RGB图像),你需要为每个通道提供相应的均值和标准差。

HWC2CHW

HWC2CHW变换用于转换图像格式。在不同的硬件设备中可能会对(height, width, channel)或(channel, height, width)两种不同格式有针对性优化。MindSpore设置HWC为默认图像格式,在有CHW格式需求时,可使用该变换进行处理。
这里我们先将前文中normalized_image处理为HWC格式,然后进行转换。可以看到转换前后的shape发生了变化。

from mindspore.dataset import vision
from PIL import Image
import numpy as np# 随机生成一个像素值在[0, 255]的48x48图像
random_np = np.random.randint(0, 255, (48, 48), np.uint8)
random_image = Image.fromarray(random_np)# 将PIL图像转换为NumPy数组
random_np = np.array(random_image)# 创建Rescale变换
rescale = vision.Rescale(1.0 / 255.0, 0)# 应用Rescale变换
rescaled_image = rescale(random_np)# 定义归一化的均值和标准差
mean = (0.1307,)
std = (0.3081,)# 创建Normalize变换
normalize = vision.Normalize(mean=mean, std=std)# 应用Normalize变换
normalized_image = normalize(rescaled_image)# 将单通道图像扩展为HWC格式
hwc_image = np.expand_dims(normalized_image, -1)# 创建HWC2CHW变换
hwc2chw = vision.HWC2CHW()# 应用HWC2CHW变换
chw_image = hwc2chw(hwc_image)# 打印HWC和CHW图像的形状
print(hwc_image.shape, chw_image.shape)
  1. np.expand_dims:
    • np.expand_dims(normalized_image, -1): 在最后一个维度上扩展维度,将单通道图像转换为HWC格式(高度、宽度、通道)。这样,hwc_image 的形状将从 (48, 48) 变为 (48, 48, 1)
  2. vision.HWC2CHW:
    • HWC2CHW: 这是MindSpore的vision模块中的一个变换,用于将图像从HWC格式(高度、宽度、通道)转换为CHW格式(通道、高度、宽度)。
  3. 应用HWC2CHW变换:
    • hwc2chw(hwc_image): 将HWC2CHW变换应用到 hwc_image 上,返回CHW格式的图像。这样,chw_image 的形状将从 (48, 48, 1) 变为 (1, 48, 48)
  4. 打印HWC和CHW图像的形状:
    • print(hwc_image.shape, chw_image.shape): 打印HWC和CHW图像的形状。输出将是 (48, 48, 1)(1, 48, 48)

通过这段代码,你可以将单通道图像转换为HWC格式,然后进一步转换为CHW格式,并打印出两种格式的图像形状。这对于验证图像格式转换是否正确非常有用。

Text Transforms

mindspore.dataset.text模块提供一系列针对文本数据的Transforms。与图像数据不同,文本数据需要有分词(Tokenize)、构建词表、Token转Index等操作。这里简单介绍其使用方法。
首先我们定义三段文本,作为待处理的数据,并使用GeneratorDataset进行加载。

from mindspore.dataset import GeneratorDataset# 定义数据生成器
def text_generator(data):for text in data:yield (text,)# 创建文本数据集
texts = ['Welcome to Beijing']
test_dataset = GeneratorDataset(source=text_generator(texts), column_names=['text'])# 打印数据集中的数据
for data in test_dataset.create_dict_iterator():print(data)
  1. GeneratorDataset:
    • GeneratorDataset: 这是MindSpore的一个数据集类,用于从一个生成器函数创建数据集。source 是生成器函数,column_names 是数据集的列名。
  2. 定义数据生成器:
    • text_generator(data): 这是一个生成器函数,接受一个包含文本数据的列表作为输入。它使用 yield 返回每个文本数据。
  3. 创建文本数据集:
    • texts = [‘Welcome to Beijing’]: 定义一个包含文本数据的列表。
    • test_dataset = GeneratorDataset(source=text_generator(texts), column_names=[‘text’]): 使用 text_generator 和指定的列名创建一个 GeneratorDataset 数据集。
  4. 打印数据集中的数据:
    • for data in test_dataset.create_dict_iterator(): print(data): 使用 create_dict_iterator 创建一个迭代器来遍历数据集,并打印每条数据。

通过这段代码,你可以创建一个包含文本数据的 GeneratorDataset 数据集,并迭代打印数据集中的每条数据。这适用于需要从生成器创建自定义数据集的场景。

PythonTokenizer

分词(Tokenize)操作是文本数据的基础处理方法,MindSpore提供多种不同的Tokenizer。这里我们选择基础的PythonTokenizer举例,此Tokenizer允许用户自由实现分词策略。随后我们利用map操作将此分词器应用到输入的文本中,对其进行分词。

from mindspore.dataset import GeneratorDataset, text# 定义数据生成器
def text_generator(data):for text in data:yield (text,)# 创建文本数据集
texts = ['Welcome to Beijing']
test_dataset = GeneratorDataset(source=text_generator(texts), column_names=['text'])# 定义自定义分词器
def my_tokenizer(content):return content.split()# 应用自定义分词器
test_dataset = test_dataset.map(operations=text.PythonTokenizer(my_tokenizer), input_columns=['text'])# 打印数据集中的数据
print(next(test_dataset.create_tuple_iterator()))
  1. 定义数据生成器:
    • text_generator(data): 这是一个生成器函数,接受一个包含文本数据的列表作为输入。它使用 yield 返回每个文本数据。
  2. 创建文本数据集:
    • texts = [‘Welcome to Beijing’]: 定义一个包含文本数据的列表。
    • test_dataset = GeneratorDataset(source=text_generator(texts), column_names=[‘text’]): 使用 text_generator 和指定的列名创建一个 GeneratorDataset 数据集。
  3. 定义自定义分词器:
    • my_tokenizer(content): 这是一个简单的分词器函数,使用 split() 方法将输入文本按空格分割成单词列表。
  4. 应用自定义分词器:
    • test_dataset = test_dataset.map(operations=text.PythonTokenizer(my_tokenizer), input_columns=[‘text’]): 使用 map 方法将自定义分词器应用到数据集的 text 列。text.PythonTokenizer 是一个MindSpore的API,用于将Python函数包装成分词器。
  5. 打印数据集中的数据:
    • print(next(test_dataset.create_tuple_iterator())): 使用 create_tuple_iterator 创建一个迭代器来遍历数据集,并打印数据集中的第一条数据。

通过这段代码,你可以创建一个包含文本数据的 GeneratorDataset 数据集,并应用自定义分词器对文本进行分词,然后打印分词后的数据。这适用于需要对文本数据进行预处理的场景。

Lookup

Lookup为词表映射变换,用来将Token转换为Index。在使用Lookup前,需要构造词表,一般可以加载已有的词表,或使用Vocab生成词表。这里我们选择使用Vocab.from_dataset方法从数据集中生成词表。

from mindspore.dataset import GeneratorDataset, text
from mindspore.dataset.text import Vocab# 定义数据生成器
def text_generator(data):for text in data:yield (text,)# 创建文本数据集
texts = ['Welcome to Beijing']
test_dataset = GeneratorDataset(source=text_generator(texts), column_names=['text'])# 定义自定义分词器
def my_tokenizer(content):return content.split()# 应用自定义分词器
test_dataset = test_dataset.map(operations=text.PythonTokenizer(my_tokenizer), input_columns=['text'])# 创建词汇表
vocab = Vocab.from_dataset(test_dataset, columns=['text'])# 打印词汇表
print(vocab.vocab())# 使用词汇表映射文本数据
test_dataset = test_dataset.map(operations=text.Lookup(vocab), input_columns=['text'])# 打印数据集中的数据
print(next(test_dataset.create_tuple_iterator()))
  1. 定义数据生成器:
    • text_generator(data): 这是一个生成器函数,接受一个包含文本数据的列表作为输入。它使用 yield 返回每个文本数据。
  2. 创建文本数据集:
    • texts = [‘Welcome to Beijing’]: 定义一个包含文本数据的列表。
    • test_dataset = GeneratorDataset(source=text_generator(texts), column_names=[‘text’]): 使用 text_generator 和指定的列名创建一个 GeneratorDataset 数据集。
  3. 定义自定义分词器:
    • my_tokenizer(content): 这是一个简单的分词器函数,使用 split() 方法将输入文本按空格分割成单词列表。
  4. 应用自定义分词器:
    • test_dataset = test_dataset.map(operations=text.PythonTokenizer(my_tokenizer), input_columns=[‘text’]): 使用 map 方法将自定义分词器应用到数据集的 text 列。text.PythonTokenizer 是一个MindSpore的API,用于将Python函数包装成分词器。
  5. 创建词汇表:
    • vocab = Vocab.from_dataset(test_dataset, columns=[‘text’]): 从数据集的指定列创建一个词汇表 Vocab 对象。
  6. 打印词汇表:
    • print(vocab.vocab()): 打印词汇表,显示词汇和其索引。
  7. 使用词汇表映射文本数据:
    • test_dataset = test_dataset.map(operations=text.Lookup(vocab), input_columns=[‘text’]): 使用 map 方法将 text.Lookup 操作应用到数据集的 text 列,将文本数据映射为词汇索引。
  8. 打印数据集中的数据:
    • print(next(test_dataset.create_tuple_iterator())): 使用 create_tuple_iterator 创建一个迭代器来遍历数据集,并打印数据集中的第一条数据。

通过这段代码,你可以创建一个包含文本数据的 GeneratorDataset 数据集,应用自定义分词器进行分词,创建词汇表 Vocab,将文本数据映射为词汇索引,并打印映射后的数据。这适用于需要对文本数据进行预处理并转换为索引表示的场景。

Lambda Transforms

Lambda函数是一种不需要名字、由一个单独表达式组成的匿名函数,表达式会在调用时被求值。Lambda Transforms可以加载任意定义的Lambda函数,提供足够的灵活度。在这里,我们首先使用一个简单的Lambda函数,对输入数据乘2:

from mindspore.dataset import GeneratorDataset# 创建数据集
test_dataset = GeneratorDataset([1, 2, 3], 'data', shuffle=False)# 应用映射操作
test_dataset = test_dataset.map(operations=lambda x: x * 2)# 打印数据集中的数据
print(list(test_dataset.create_tuple_iterator()))
  1. 创建数据集:
    • test_dataset = GeneratorDataset([1, 2, 3], ‘data’, shuffle=False): 使用 GeneratorDataset 创建一个数据集,数据源是一个包含 [1, 2, 3] 的列表,列名为 'data',并且不进行洗牌操作。
  2. 应用映射操作:
    • test_dataset = test_dataset.map(operations=lambda x: x * 2): 使用 map 方法将一个匿名函数 lambda x: x * 2 应用到数据集的每一项数据上,将每个数据乘以 2。
  3. 打印数据集中的数据:
    • print(list(test_dataset.create_tuple_iterator())): 使用 create_tuple_iterator 创建一个迭代器来遍历数据集,并将其转换为列表后打印。

通过这段代码,你可以创建一个包含 [1, 2, 3] 的数据集,应用映射操作将每个数据乘以 2,然后打印映射后的数据。这适用于需要对数据进行简单变换的场景。

from mindspore.dataset import GeneratorDataset# 定义函数
def func(x):return x * x + 2# 创建数据集
test_dataset = GeneratorDataset([1, 2, 3], 'data', shuffle=False)# 应用映射操作
test_dataset = test_dataset.map(operations=lambda x: func(x))# 打印数据集中的数据
print(list(test_dataset.create_tuple_iterator()))

s

  1. 定义函数:
    • func(x): 这是一个简单的函数,接受一个输入 x,返回 x 的平方加上 2。
  2. 创建数据集:
    • test_dataset = GeneratorDataset([1, 2, 3], ‘data’, shuffle=False): 使用 GeneratorDataset 创建一个数据集,数据源是一个包含 [1, 2, 3] 的列表,列名为 'data',并且不进行洗牌操作。
  3. 应用映射操作:
    • test_dataset = test_dataset.map(operations=lambda x: func(x)): 使用 map 方法将一个匿名函数 lambda x: func(x) 应用到数据集的每一项数据上,调用 func 函数对每个数据进行处理。
  4. 打印数据集中的数据:
    • print(list(test_dataset.create_tuple_iterator())): 使用 create_tuple_iterator 创建一个迭代器来遍历数据集,并将其转换为列表后打印。

通过这段代码,你可以创建一个包含 [1, 2, 3] 的数据集,应用映射操作调用 func 函数对每个数据进行处理,然后打印处理后的数据。这适用于需要对数据进行复杂变换的场景。

整体代码

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# Download data from open datasetsurl = "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')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)random_np = np.random.randint(0, 255, (48, 48), np.uint8)
random_image = Image.fromarray(random_np)
print(random_np)rescale = vision.Rescale(1.0 / 255.0, 0)
rescaled_image = rescale(random_image)
print(rescaled_image)normalize = vision.Normalize(mean=(0.1307,), std=(0.3081,))
normalized_image = normalize(rescaled_image)
print(normalized_image)hwc_image = np.expand_dims(normalized_image, -1)
hwc2chw = vision.HWC2CHW()
chw_image = hwc2chw(hwc_image)
print(hwc_image.shape, chw_image.shape)texts = ['Welcome to Beijing']
test_dataset = GeneratorDataset(texts, 'text')def my_tokenizer(content):return content.split()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())test_dataset = test_dataset.map(text.Lookup(vocab))
print(next(test_dataset.create_tuple_iterator()))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 + 2test_dataset = test_dataset.map(lambda x: func(x))
print(list(test_dataset.create_tuple_iterator()))
  1. 导入必要的库和模块
    • numpy:用于数值计算。
    • PIL.Image:用于图像处理。
    • download:用于下载数据集。
    • mindspore.dataset:包含数据处理和变换的模块。
  2. 下载和加载数据集
    • 使用download函数下载MNIST数据集并解压。
    • 使用MnistDataset加载训练数据集。
  3. 数据变换
    • Compose:组合多个变换操作。
    • Rescale:调整图像像素值的大小。
    • Normalize:对图像进行归一化处理。
    • HWC2CHW:转换图像格式从HWC到CHW。
  4. 图像变换示例
    • 生成随机图像并应用RescaleNormalize变换。
    • 使用HWC2CHW变换转换图像格式。
  5. 文本变换示例
    • 使用PythonTokenizer进行分词。
    • 使用Vocab生成词表并应用Lookup变换。
  6. Lambda变换示例
    • 使用简单的Lambda函数对数据进行变换。
    • 定义复杂函数并使用Lambda函数进行变换。
  • mindspore.dataset.transforms.Compose:将多个变换操作组合成单个操作。
  • mindspore.dataset.vision.Rescale:调整图像像素值的大小。
  • mindspore.dataset.vision.Normalize:对图像进行归一化处理。
  • mindspore.dataset.vision.HWC2CHW:转换图像格式从HWC到CHW。
  • mindspore.dataset.text.PythonTokenizer:使用自定义函数进行分词。
  • mindspore.dataset.text.Vocab:生成词表。
  • mindspore.dataset.text.Lookup:将Token转换为Index。
  • mindspore.dataset.GeneratorDataset:从生成器创建数据集。
  • mindspore.dataset.MnistDataset:加载MNIST数据集。
  • mindspore.dataset.map:对数据集应用变换操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python和MediaPipe实现手势控制音量(Win/Mac)

1. 依赖库介绍 OpenCV OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它包含了数百个计算机视觉算法。 MediaPipe MediaPipe是一个跨平台的机器学习解决方案库,可以用于实时人类姿势估计、手势识…

EXSI 实用指南 2024 -编译环境 Ubuntu 安装篇(二)

1. 引言 在当今的虚拟化领域,VMware ESXi 是备受推崇的虚拟化平台,广泛应用于企业和个人用户中。它以卓越的性能、稳定的运行环境和丰富的功能,为用户提供了高效的硬件资源管理和简化的 IT 基础设施维护。然而,如何在不同操作系统…

LeetCode Day8|● 344.反转字符串(原地) ● 541. 反转字符串II(i可以大步跨越) ● 卡码网:54.替换数字(ACM模式多熟悉熟悉)

字符串part01 day8-1 ● 344.反转字符串整体思路代码实现总结 day8-2 ● 541. 反转字符串II整体思路代码实现总结 day8-3 ● 卡码网:54.替换数字题目解题思路代码实现总结 day8-1 ● 344.反转字符串 整体思路 字符串和数组的思路差不多 原地操作 代码实现 class…

非常好的新版网盘系统,是一款PHP网盘与外链分享程序,支持文件预览

这是一款PHP网盘与外链分享程序,支持所有格式文件的上传, 可以生成文件外链、图片外链、音乐视频外链,生成外链同时自动生成相应的UBB代码和HTML代码, 还可支持文本、图片、音乐、视频在线预览,这不仅仅是一个网盘&a…

算法思想总结:字符串

一、最长公共前缀 . - 力扣&#xff08;LeetCode&#xff09; 思路1&#xff1a;两两比较 时间复杂度mn 实现findcomon返回两两比较后的公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//两两比较 string retstrs[0];size…

MySQL里的累计求和

在MySQL中&#xff0c;你可以使用SUM()函数来进行累计求和。如果你想要对一个列进行累计求和&#xff0c;可以使用OVER()子句与ORDER BY子句结合&#xff0c;进行窗口函数的操作。 以下是一个简单的例子&#xff0c;假设我们有一个名为sales的表&#xff0c;它有两个列&#x…

Android之间互传消息之ServerSocket,Android服务端接收Socket发送的TCP

Android之间在在局域网下互传消息&#xff0c;咱就不用走云服务器了吧&#xff0c;让俩安卓设备&#xff0c;自己传呗 方式1 通过在安卓设备上搭建Web服务器接收数据&#xff0c;可参考 Android使用AndServer在安卓设备上搭建服务端(Java)(Kotlin)两种写法 方式2 本文章&…

Open3d入门 点云中的重要概念

点云是由一组三维空间中的点组成的数据结构&#xff0c;常用于计算机视觉、3D建模和地形图生成等领域。每个点包含空间坐标&#xff08;x, y, z&#xff09;以及其他属性&#xff08;如颜色、密度等&#xff09;。以下是一些重要的点云概念&#xff1a; 1. 体素 (Voxel) 体素…

Vue3+Vite+TS+Axios整合详细教程

1. Vite 简介 Vite是新一代的前端构建工具&#xff0c;在尤雨溪开发Vue3.0的时候诞生。类似于Webpack Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码&#xff0c;在服务器端按需编译返回&#xff0c;完全跳过了打包这个概念&#xff0c;服务器随起随用。生产中利用…

赛氪网荣获2024年中国高校计算机教育大会合作伙伴荣誉

2024年7月13日&#xff0c;在黑龙江哈尔滨召开的“2024年中国高校计算机教育大会&#xff08;CCEC2024&#xff09;”&#xff0c;环球赛乐&#xff08;北京&#xff09;科技有限公司(以下简称”赛氪网“)凭借其在高等教育与科技创新领域的卓越贡献&#xff0c;荣幸地获得了本次…

Python基础——函数

函数 和c语言函数意义相同&#xff0c;函数定义基础语法如下。 def 函数名&#xff08;传入参数&#xff09;:函数体return 返回值 展示自定义一个函数并对其进行封装。 # 自定义函数字符串长度计算str1 "itcast" count0 for x in str1:count 1 print(f"{c…

昇思25天学习打卡营第20天|CycleGAN图像风格迁移互换

模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。…

0基础学会在亚马逊云科技AWS上利用SageMaker、PEFT和LoRA高效微调AI大语言模型(含具体教程和代码)

项目简介&#xff1a; 小李哥今天将继续介绍亚马逊云科技AWS云计算平台上的前沿前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS上的AI软甲开发最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon SageMaker上…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(九)-无人机服务区分离

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

Solidworks工程图替换参考零件

1.用solidworks选择工程图文件&#xff0c;点击参考。 2.双击文件名 3.选择新的参考零件&#xff0c;点击确定。

[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法

一、问题&#xff1a; 有时在 Postgres 上部署 Rails 应用程序时&#xff0c;可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…

力扣第406场周赛

力扣第406场周赛 100352. 交换后字典序最小的字符串 - 力扣&#xff08;LeetCode&#xff09; 贪心&#xff0c;从 0 0 0开始扫描到 n n n如果有一个可以交换的就立马交换 class Solution { public:string getSmallestString(string s) {for(int i1;i<s.size();i){if(s[i…

【PyQt】

PyQT5线程基础&#xff08;2&#xff09; 线程案例案例一案例二 线程案例 案例一 案例一代码通过线程实现点击按钮向线程传输地址&#xff0c;程序等待20秒后&#xff0c;返回结果。 通过QtDesigner创建如下图所示的界面ui&#xff0c;并用UIC工具转成对应的py文件。 Ui_tes…

C语言之指针的奥秘(三)

一、字符指针变量 在指针的类型中&#xff0c;有字符指针char*&#xff0c;一般使用&#xff1a; #include<stdio.h> int main() {char ch w;char* p &ch;*p w;return 0; } 还有一种方式&#xff1a; #include<stdio.h> int main() {const char* p &qu…

123456

截止2023年10月&#xff0c;目前已公开的官方矢量数据有3个网站&#xff0c;按照公开时间顺序分别是&#xff1a;1&#xff09;全国地理信息资源目录服务系统&#xff1b;2&#xff09;西藏自治区自然资源厅&#xff1b;3&#xff09;福建省标准地图服务。我们将持续更新公开的…