在深度学习过程中,原始数据通常需要经过预处理才能输入到神经网络中进行训练。MindSpore提供了丰富的数据变换(Transforms)工具,用于不同类型的数据预处理。本文在学习中,总结了MindSpore中的常用数据变换,包括图像、文本和音频数据的处理,并配以图表和思维导图帮助理解。
一、常用Transforms
1. Compose
Compose
接收一个数据增强操作序列,并将其组合成一个单一的操作。以下示例展示了在MNIST数据集上的应用。
composed = transforms.Compose([
vision.Rescale(1.0 / 255.0, 0),
vision.Normalize(mean=(0.1307,), std=(0.3081,)),
vision.HWC2CHW()
])
常用Transforms总结
Transform | 参数 | 作用 | 示例 |
---|---|---|---|
Compose | transforms (list) | 组合多个数据增强操作 | transforms.Compose([vision.Rescale(1.0 / 255.0, 0), vision.Normalize(mean=(0.1307,), std=(0.3081,)), vision.HWC2CHW()]) |
二、图像Transforms
1. Rescale
用于调整图像像素值的大小,包括缩放因子rescale
和平移因子shift
。
rescale = vision.Rescale(1.0 / 255.0, 0)
rescaled_image = rescale(random_image)
2. Normalize
对输入图像进行归一化处理。
normalize = vision.Normalize(mean=(0.1307,), std=(0.3081,))
normalized_image = normalize(rescaled_image)
3. HWC2CHW
转换图像格式,从(height, width, channel)转换为(channel, height, width)。
hwc2chw = vision.HWC2CHW()
chw_image = hwc2chw(hwc_image)
图像Transforms总结
Transform | 参数 | 作用 | 示例 |
---|---|---|---|
Rescale | rescale (float), shift (float) | 调整图像像素值 | vision.Rescale(1.0 / 255.0, 0) |
Normalize | mean (tuple), std (tuple) | 对图像进行归一化 | vision.Normalize(mean=(0.1307,), std=(0.3081,)) |
HWC2CHW | - | 转换图像格式 | vision.HWC2CHW() |
三、文本Transforms
1. PythonTokenizer
用于分词(Tokenize)。
def my_tokenizer(content):
return content.split()
test_dataset = test_dataset.map(text.PythonTokenizer(my_tokenizer))
2. Lookup
将Token转换为Index。
vocab = text.Vocab.from_dataset(test_dataset)
test_dataset = test_dataset.map(text.Lookup(vocab))
文本Transforms总结
Transform | 参数 | 作用 | 示例 |
---|---|---|---|
PythonTokenizer | tokenizer_func (function) | 文本分词 | test_dataset.map(text.PythonTokenizer(my_tokenizer)) |
Lookup | vocab (Vocab) | Token转换为Index | test_dataset.map(text.Lookup(vocab)) |
四、Lambda Transforms
Lambda函数可以用于定义任意的数据处理操作。
示例1:简单的Lambda函数
test_dataset = test_dataset.map(lambda x: x * 2)
示例2:复杂的Lambda函数
def func(x):
return x * x + 2
test_dataset = test_dataset.map(lambda x: func(x))
Lambda Transforms总结
Transform | 参数 | 作用 | 示例 |
---|---|---|---|
Lambda | lambda_func (function) | 应用任意Lambda函数 | test_dataset.map(lambda x: x * 2) |
五、思维导图
为更好地展示数据变换的分类和关系,下面是一个简单的思维导图:
六、其他工具的总结
下面是使用表格展示 mindspore.dataset.transforms
和 mindspore.dataset.vision
两大模块的数据增强操作的信息。信息来源于mindspore.dataset.text
通用数据增强
操作名称 | 描述 |
---|---|
Compose | 将多个数据增强操作组合使用 |
Concatenate | 在输入数据的某一个轴上进行数组拼接,目前仅支持拼接形状为 1D 的数组 |
Duplicate | 将输入的数据列复制得到新的数据列 |
Fill | 将 Tensor 的所有元素都赋值为指定的值 |
Mask | 用条件判断输入 Tensor 的内容,并返回一个掩码 Tensor |
OneHot | 对输入标签进行 OneHot 编码 |
PadEnd | 对输入 Tensor 进行填充 |
RandomApply | 指定一组数据增强处理及其被应用的概率,按概率随机应用其中的增强处理 |
RandomChoice | 从一组数据增强变换中随机选择一个进行应用 |
RandomOrder | 给一个数据增强的列表,随机打乱数据增强处理的顺序 |
Slice | 对输入进行切片 |
TypeCast | 将输入的 Tensor 转换为指定的数据类型 |
Unique | 对输入张量进行唯一运算 |
Relational | 关系运算符 |
视觉数据增强
操作名称 | 描述 |
---|---|
AdjustBrightness | 调整输入图像的亮度 |
AdjustContrast | 调整输入图像的对比度 |
AdjustGamma | 对输入图像应用伽马校正 |
AdjustHue | 调整输入图像的色调 |
AdjustSaturation | 调整输入图像的饱和度 |
AdjustSharpness | 调整输入图像的锐度 |
Affine | 对输入图像进行仿射变换 |
AutoAugment | 应用 AutoAugment 数据增强方法 |
AutoContrast | 在输入图像上应用自动对比度 |
BoundingBoxAugment | 对图像的随机标注边界框区域应用给定的图像变换处理 |
CenterCrop | 对输入图像应用中心区域裁剪 |
ConvertColor | 更改图像的色彩空间 |
Crop | 在输入图像上裁剪出指定区域 |
CutMixBatch | 对输入批次的图像和标注应用剪切混合转换 |
CutOut | 从输入图像数组中随机裁剪出给定数量的正方形区域 |
Decode | 将输入的压缩图像解码为 RGB 格式 |
Equalize | 对输入图像进行直方图均衡化 |
Erase | 使用指定的值擦除输入图像 |
FiveCrop | 在输入 PIL 图像的中心与四个角处分别裁剪指定尺寸大小的子图 |
GaussianBlur | 使用指定的高斯核对输入图像进行模糊处理 |
Grayscale | 将输入 PIL 图像转换为灰度图 |
HorizontalFlip | 水平翻转输入图像 |
HsvToRgb | 将输入的 HSV 格式图像转换为 RGB 格式 |
HWC2CHW | 将输入图像的 shape 从 <H, W, C> 转换为 <C, H, W> |
Invert | 对输入的 RGB 图像进行色彩反转 |
LinearTransformation | 使用指定的变换方阵和均值向量对输入图像进行线性变换 |
MixUp | 随机混合一批输入的图像及其标签 |
Normalize | 根据均值和标准差对输入图像进行归一化 |
Pad | 填充图像 |
PadToSize | 将图像填充到固定大小 |
Perspective | 对输入图像进行透视变换 |
Posterize | 减少图像的颜色通道的比特位数,使图像变得高对比度和颜色鲜艳 |
RandAugment | 对输入图像应用 RandAugment 数据增强方法 |
RandomAdjustSharpness | 以给定的概率随机调整输入图像的锐度 |
RandomAffine | 对输入图像应用随机仿射变换 |
RandomAutoContrast | 以给定的概率自动调整图像的对比度 |
RandomColor | 随机调整输入图像的颜色 |
RandomColorAdjust | 随机调整输入图像的亮度、对比度、饱和度和色调 |
RandomCrop | 对输入图像进行随机区域的裁剪 |
RandomEqualize | 以给定的概率随机对输入图像进行直方图均衡化 |
RandomErasing | 按指定的概率擦除输入图像上随机矩形区域内的像素 |
RandomGrayscale | 按指定的概率将输入图像转换为灰度图 |
RandomHorizontalFlip | 对输入图像按给定的概率进行水平随机翻转 |
RandomInvert | 以给定的概率随机反转图像的颜色 |
RandomPerspective | 按指定的概率对输入图像进行透视变换 |
RandomPosterize | 随机减少图像的颜色通道的比特位数 |
RandomResizedCrop | 对输入图像进行随机裁剪,并使用指定的插值方式调整为指定的尺寸大小 |
RandomRotation | 在指定的角度范围内,随机旋转输入图像 |
RandomSelectSubpolicy | 从策略列表中随机选择一个子策略应用于输入图像 |
RandomSharpness | 在固定或随机的范围调整输入图像的锐度 |
RandomSolarize | 从给定阈值范围内随机选择一个子范围,对位于给定子范围内的像素,将其像素值设置为(255 - 原本像素值) |
RandomVerticalFlip | 以给定的概率对输入图像在垂直方向进行随机翻转 |
Rescale | 基于给定的缩放和平移因子调整图像的像素大小 |
Resize | 对输入图像使用给定的插值方式调整为给定的尺寸大小 |
RgbToHsv | 将输入的 RGB 格式图像转换为 HSV 格式 |
Rotate | 将输入图像旋转指定的度数 |
SlicePatches | 在水平和垂直方向上将 Tensor 切片为多个块 |
Solarize | 通过反转阈值内的所有像素值,对输入图像进行色调调节 |
SwapRedBlue | 将输入图像的红蓝通道进行互换 |
TenCrop | 在输入 PIL 图像的中心和四个角上裁剪指定尺寸大小的子图,并对每个裁剪的子图进行水平翻转 |
ToNumpy | 将 PIL 图像转换为 NumPy 格式 |
ToPIL | 将 NumPy 图像转换为 PIL 格式 |
ToTensor | 将 PIL 图像或 NumPy 图像转换为 Tensor |
ToType | 将 NumPy 数据类型转换为 Tensor 数据类型 |
TrivialAugment | 应用 TrivialAugment 数据增强方法 |
UniformAugment | 应用 UniformAugment 数据增强方法 |
VerticalFlip | 垂直翻转输入图像 |
示例代码
Compose
transform = [vision.Resize((224, 224)), vision.RandomHorizontalFlip()]
trans = vision.Compose(transform)
data = ds.ImageFolderDataset(DATA_DIR).map(operations=trans)
RandomCrop
trans = vision.RandomCrop((224, 224))
data = ds.ImageFolderDataset(DATA_DIR).map(operations=trans)
Normalize
trans = vision.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
data = ds.ImageFolderDataset(DATA_DIR).map(operations=trans)