昇思25天学习打卡营第4天|数据变换(Transforms)

 一、简介:

数据变换是指将已有的数据转换成可以提供给模型直接训练和验证的数据格式,在深度学习中一般被称为数据预处理,之前在昇思25天学习打卡营第3天|数据集Dataset-CSDN博客 介绍数据集的时候已经有了一个简单的使用,下面将具体介绍如何使用MindSpore中已有的方法,对数据进行处理。再次感谢华为昇思提供的支持和指导(日常感谢,手动狗头了)。

二、环境依赖:

老规矩,先把我们需要的包和环境准备好:

import time
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

如果还没有安装MindSpore框架的宝子,可以回看我的第一天打卡博客:昇思25天学习打卡营第1天|快速入门,安装很简单,自行操作一下(dog),安装完成之后,我们先下载用于预处理操作的数据集Mnist:

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

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


print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 

三、常用的预处理方法:

MindSpore提供了很多封装好的方法用于数据预处理(和pytorch一样),这里我们主要介绍:Common Transforms,Vision Transforms,Text Transforms和Lamda Transforms四种常用的方法。

1、Common Transforms:

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

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)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

代码中很多方法在第一天打卡和第三天打卡的博客中已经介绍,这里只做简单说明:使用mindspore自带的transforms.Compose()方法,将输入的数据先进行灰度化处理,再进行归一化,并将图片的维度顺序调整成适合GPU处理的格式。 

2、Vision Transforms:

(1) Rescale:

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

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

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

np.random.randint(0, 255, (48, 48), np.uint8)使用NumPy库生成了一个48x48像素的随机整数数组,每个像素的值在0到254之间,数据类型为无符号8位整数(uint8)。

random_image = Image.fromarray(random_np)将这个数组转换为一个PIL图像对象,这个图像的每个像素值都是之前生成的随机整数,因此它看起来会是一幅随机的像素图。 

rescale = vision.Rescale(1.0 / 255.0, 0)
rescaled_image = rescale(random_image)
print(rescaled_image)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 

(2) Normlize:

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

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

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

normalize = vision.Normalize(mean=(0.1307,), std=(0.3081,))
normalized_image = normalize(rescaled_image)
print(normalized_image)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 

(3) HWC2CHW:

HWC2CHW变换用于转换图像格式。在不同的硬件设备中可能会对(height, width, channel)或(channel, height, width)两种不同格式有针对性优化。MindSpore设置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)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 

3、Text Transforms:

mindspore.dataset.text()模块提供一系列针对文本数据的Transforms。与图像数据不同,文本数据需要有分词(Tokenize)、构建词表、Token转Index等操作。

(1)PythonTokenizer:

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

# 先用GeneratorDataset()生成实验用的文本数据和对应标签
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()))
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 

 (3)Lookup:

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

vocab = text.Vocab.from_dataset(test_dataset)

print(vocab.vocab())
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 

 生成词表后,可以配合map方法进行词表映射变换,将Token转为Index:

test_dataset = test_dataset.map(text.Lookup(vocab))
print(next(test_dataset.create_tuple_iterator()))
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 

4、Lambda Transforms:

Lambda Transforms是将python当中的匿名函数和数据预处理相结合,利用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()))

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些使用transforms进行数据增强的代码示例: 1. 使用FiveCrop进行数据增强: ```python train_transform = transforms.Compose(\[ transforms.Resize((224, 224)), transforms.FiveCrop(112), transforms.Lambda(lambda crops: torch.stack(\[(transforms.ToTensor()(crop)) for crop in crops\])) \]) ``` 2. 使用TenCrop进行数据增强: ```python train_transform = transforms.Compose(\[ transforms.Resize((224, 224)), transforms.TenCrop(112, vertical_flip=False), transforms.Lambda(lambda crops: torch.stack(\[(transforms.ToTensor()(crop)) for crop in crops\])) \]) ``` 3. 使用RandomHorizontalFlip进行数据增强: ```python train_transform = transforms.Compose(\[ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), transforms.CenterCrop(196) \]) ``` 这些代码示例展示了如何使用transforms模块中的不同函数来进行数据增强操作,包括裁剪、翻转和缩放等。你可以根据自己的需求选择适合的数据增强方式来提升模型的性能和鲁棒性。 #### 引用[.reference_title] - *1* *2* *3* [PyTorch :transforms 数据增强:裁剪、翻转、旋转](https://blog.csdn.net/qq_54641516/article/details/126981414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值