07 Transforms中常用的工具

Compose类

Compose中的参数需要的是一个列表,数据类型需要是transforms类型。

Compose([transforms参数1, transforms参数2, ...])

比如我们可以先裁剪再调用ToTensor方法

Example:  
    >>> transforms.Compose([    
    >>>     transforms.CenterCrop(10),    
    >>>     transforms.PILToTensor(),    
    >>>     transforms.ConvertImageDtype(torch.float),    
    >>>  ])

实例化对象后,compose对象需要输入Image。

ToTensor类

将np或者PIL数据类型的图片转换为tensor数据类型。

ToPILImage类

将tensor或者np数据类型的图片转换为PIL数据类型

Normalize类

进行归一化

Normalize a tensor image with mean and standard deviation //用平均值和标准差来归一化一张图像

output[channel] = (input[channel] - mean[channel]) / std[channel] //计算公式
writer = SummaryWriter("logs")  
img = Image.open("images/6240338_93729615ec.jpg")  
  
trans_totensor = transforms.ToTensor()  
img_tensor = trans_totensor(img)  
  
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])  
img_norm = trans_norm(img_tensor)  
writer.add_image("Normalize", img_norm, 1)  
writer.close()

由于我们传入的是三通道图片,因此均值和方差均需传入长度为3的数组,我们设置的值均为0.5,它的作用是将[0,1]之间的数据转换为[-1,1]之间的数据。

在这里插入图片描述

输入前和输入后的图片

在这里插入图片描述

Resize类

Resize the input image to the given size. 

size (sequence or int): Desired output size. If size is a sequence like  
    (h, w), output size will be matched to this. If size is an int,    smaller edge of the image will be matched to this number.    
    i.e, if height > width, then image will be rescaled to    
    (size * height / width, size).

//如果大小是这样的序列(h,w),输出大小将与此匹配。如果大小是int,图像的较小边缘将与该数字相匹配。
即,如果高度 > 宽度,则图像将被重新缩放为
(尺寸 * 高度 / 宽度,尺寸)。

我们可以先将PIL图片用resize方法进行放缩,再转为tensor类型的图片,完成一系列流水线操作

# Resize
trans_resize = transforms.Resize((512, 512))  
#img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)  
#img_resize PIL -> totensor ->img_resize tensor
img_resize = trans_totensor(img_resize)  
writer.add_image("Resize", img_resize, 0)

或者可以用compose方法,进行放缩变换

# Compose - resize - 2
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

注意:老版的resize类不支持tensor数据类型,但新版的resize已经支持了,不需要进行这么麻烦的操作。

RandomCrop类

随机裁剪,对这个类我们只简单看一下size的作用

size (sequence or int): Desired output size of the crop. 
If size is an int instead of sequence like (h, w), a square crop (size, size) is made. 
If provided a sequence of length 1, it will be interpreted as (size[0], size[0]).
//size(sequence或int):作物所需的输出大小。
如果size是int而不是像(h,w)那样的序列,则会生成方形裁剪(size,size)。
如果提供长度为1的序列,它将被解释为(size[0],size[0])。
#RandomCrop
trans_random = transforms.RandomCrop(128)  
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])  
for i in range(10) :  
    img_crop = trans_compose_2(img)  
    writer.add_image("RandomCrop", img_crop, i)

RandomCrop会对给定的裁剪大小对图片进行随机裁剪,结果如下

在这里插入图片描述在这里插入图片描述

这里只列出其中两张图片。

注意:给定的裁剪大小必须要小于图片的大小,不然会报错。

总结

  1. 关注输入和输出类型,多看官方文档,比网上、CSDN搜索要准确的多
  2. 关注方法需要什么参数,比如初始化时需要的参数。
  3. 不知道返回值类型时,用print或者print(type())或debug来查看。
### 回答1: PyTorchtransforms模块是用于数据预处理和数据增强的工具。它提供了一系列常用数据变换方法,如随机裁剪、随机旋转、随机翻转、归一化等。transforms模块可以应用于图像、文本、音频等数据类型。 使用transforms模块,需要先将数据转换为torchvision数据集格式,然后使用transforms.Compose()方法将多个数据变换方法组合起来,最后使用torch.utils.data.DataLoader()方法加载数据集。 例如,对于图像数据,可以使用以下代码进行数据预处理和数据增强: ``` import torchvision.transforms as transforms # 定义数据变换方法 transform = transforms.Compose([ transforms.RandomResizedCrop(224), # 随机裁剪 transforms.RandomHorizontalFlip(), # 随机翻转 transforms.ToTensor(), # 转换为张量 transforms.Normalize(mean=[.485, .456, .406], std=[.229, .224, .225]) # 归一化 ]) # 加载数据集 train_dataset = torchvision.datasets.ImageFolder(root='train/', transform=transform) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) ``` 以上代码,定义了一个数据变换方法transform,包括随机裁剪、随机翻转、转换为张量和归一化。然后使用ImageFolder方法加载数据集,并将transform作为参数传入。最后使用DataLoader方法加载数据集,设置batch_size和shuffle参数。 使用transforms模块可以方便地进行数据预处理和数据增强,提高模型的泛化能力和准确率。 ### 回答2: PyTorch是深度学习领域的热门框架之一,而transforms则是PyTorch一个常用数据预处理模块。transforms可以用来完成对数据的预处理、增广等操作,可以帮助我们改善模型训练的结果。本文将回答pytorchtransforms的用法。 一、transforms的介绍 在PyTorchtransforms位于torchvision.transforms模块,是对图像进行转换的一种预处理操作。transforms可以在图像被送入模型之前对其进行多种处理。通过transforms,我们可以对图像进行裁切、缩放、旋转、翻转等操作,还能进行图像亮度、色彩、对比度等操作。这些操作对于深度学习任务非常重要,它们可以减少网络的训练误差,加快训练速度,提高模型的鲁棒性和泛化性能。 二、transforms的使用 transforms的使用非常简单。我们只需要从torchvision.transforms模块导入需要的transforms类,然后将其作为参数传递给torchvision.datasets模块数据加载函数。 例如,我们可以通过如下方式使用transforms完成图像的随机裁剪操作: ```Python from torchvision import transforms transform = transforms.Compose([ transforms.RandomCrop(224), transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)) ]) trainset = torchvision.datasets.ImageFolder(root='./data', transform=transform) ``` 在上面的代码,我们首先定义了一个transform对象。该对象包含三个操作:随机裁剪、将PIL图像转换为PyTorch的张量表示以及归一化处理。这些操作首先会被执行,并最终返回一个图像张量,该张量可以传递给模型进行训练。 三、transforms的常用操作 1. ToTensor 将PIL图像转换成PyTorch的Tensor格式。 2. Resize 将图像调整为指定的尺寸大小。 3. RandomCrop 随机裁剪给定大小的图像。 4. CenterCrop 从图像心裁剪给定大小的图像。 5. RandomRotation 随机旋转图像。 6. RandomHorizontalFlip 随机水平翻转图像。 7. RandomVerticalFlip 随机垂直翻转图像。 8. ColorJitter 对图像进行颜色抖动。 9. Normalize 对图像进行归一化处理。 10. RandomErasing 随机擦除图像给定大小的区域,用随机像素值代替。 总之,transforms是PyTorch一个强大的预处理工具,它可以帮助我们对图像进行多种操作,从而提高模型的训练效果。通过掌握transforms的用法与参数,我们可以更加方便地对原始数据进行处理和增广,以提高数据的多样性和模型的泛化性。 ### 回答3: PyTorch是一个深度学习框架,提供了许多可用的工具和库,使得数据处理和模型开发变得更为便捷。transforms模块就是其的一个工具,它主要用于对图像进行各种变换,如旋转、翻转、裁剪、缩放、标准化等,以便更好地预处理数据transforms模块常用的方法就是Compose()方法,它能够将多个变换组合在一起形成一个变换pipeline,并按顺序依次执行每个变换。例如,我们想要将图像旋转45度、裁剪出心部分、缩放到指定大小并将像素值标准化,可以通过如下代码实现: ``` from torchvision import transforms transform = transforms.Compose([ transforms.RandomRotation(45), # 随机旋转45度 transforms.CenterCrop(224), # 裁剪出心224*224的部分 transforms.Resize(256), # 缩放到指定大小 transforms.ToTensor(), # 转换为张量 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 标准化像素值 ]) ``` 以上代码我们使用了RandomRotation、CenterCrop、Resize、ToTensor和Normalize这5个transforms方法。其,RandomRotation方法可以随机旋转图像一定角度,CenterCrop方法可以切出心部分,Resize方法可以根据设定大小进行缩放,ToTensor方法可以将图像转换为张量,Normalize方法可以标准化图像的像素值。 transforms模块还有其他很多的方法,包括随机翻转、调整亮度、对比度和饱和度等。使用它们可以根据需要对数据进行各种预处理,提高模型训练的效果。 需要注意的是,在使用transforms的过程,需要保证所有数据的预处理方式一致,否则可能会导致模型训练结果不稳定。同时,还可根据实际情况自定义transforms方法,以适应更复杂的预处理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值