1、前言
在机器学习和深度学习中,数据预处理是一个非常重要的步骤。通过数据变换(Transforms),我们可以对原始数据进行预处理,使其适合送入神经网络进行训练。MindSpore 提供了多种类型的数据变换,能够处理图像、文本、音频等不同类型的数据。这些变换可以通过 map 方法传入,实现对指定数据列的处理。
mindspore.dataset 提供了一系列通用的、面向图像和文本的 Transforms,同时也支持使用 Lambda 函数。下面这个案例就是介绍transforns的用法。
2、数据变换案例
2.1通用 Transforms
mindspore.dataset.transforms 模块提供了一些通用的 Transforms,例如 Compose。Compose 接收一个数据增强操作序列,然后将其组合成单个数据增强操作。下面通过一个例子演示其使用方法。
2.1.1加载数据
我们下载 MNIST 数据集并加载训练数据集。
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
2.1.2 下载 MNIST 数据集
url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/MNIST_Data.zip"
path = download(url, "./", kind="zip", replace=True)
2.1.3加载训练数据集
train_dataset = MnistDataset('MNIST_Data/train')
2.2 查看数据形状
从数据集中取出一张图像并查看其形状。
image, label = next(train_dataset.create_tuple_iterator())
print(image.shape)
2.3 使用 Compose
我们将一系列数据变换操作组合在一起并应用到数据集上。这里使用的操作有 Rescale、Normalize 和 HWC2CHW。
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)
2.4 图像 Transforms
mindspore.dataset.vision 模块提供了一系列针对图像数据的 Transforms。在处理 MNIST 数据时,我们使用了 Rescale、Normalize 和 HWC2CHW。下面详细介绍这些变换。
2.4.1Rescale
Rescale 用于调整图像像素值的大小。参数包括 rescale 和 shift。每个像素将根据这些参数进行调整,输出的像素值计算公式为 output_i = input_i * rescale + shift。
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)
2.4.2 Normalize
Normalize 用于对输入图像进行归一化。参数包括 mean、std 和 is_hwc。每个通道根据均值和标准差进行调整,计算公式为 output_c = (input_c - mean_c) / std_c。
normalize = vision.Normalize(mean=(0.1307,), std=(0.3081,))
normalized_image = normalize(rescaled_image)
print(normalized_image)
2.4.3 HWC2CHW
HWC2CHW 用于转换图像格式。默认图像格式是 HWC(height, width, channel),转换后为 CHW(channel, height, width)。
hwc_image = np.expand_dims(normalized_image, -1)
hwc2chw = vision.HWC2CHW()
chw_image = hwc2chw(hwc_image)
print(hwc_image.shape, chw_image.shape)
2.5 文本 Transforms
mindspore.dataset.text 模块提供了一系列针对文本数据的 Transforms,包括分词(Tokenize)、构建词表、Token 转 Index 等操作。下面介绍其使用方法。
2.5.1 定义文本数据并加载
texts = ['Welcome to Beijing']
test_dataset = GeneratorDataset(texts, 'text')
2.5.2 PythonTokenizer
分词是文本数据的基础处理方法。这里使用基础的 PythonTokenizer 进行分词。
def my_tokenizer(content):
return content.split()
test_dataset = test_dataset.map(text.PythonTokenizer(my_tokenizer))
print(next(test_dataset.create_tuple_iterator()))
2.5.3 Lookup
Lookup 用于将 Token 转换为 Index。首先从数据集中生成词表,然后进行词表映射。
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()))
2.6 Lambda Transforms
Lambda 函数是一种匿名函数,表达式会在调用时被求值。Lambda Transforms 提供了灵活性,可以定义任意的 Lambda 函数进行数据处理。
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()))
3、小结
通过以上步骤和示例,可以简单的使用 MindSpore 提供的 Transforms 对不同类型的数据进行预处理。这些变换操作可以将原始数据处理成适合模型训练的格式,提高模型的训练效果和效率。