torchvision中的transforms
transforms的结构
from torchvision import transforms
transforms.py文件可以看作一个工具箱,用于对图片的变换(尺寸、数据类型...)
在PyCharm中可以使用"alt + 7"快捷键显示 源文件的结构:Structure
在源文件中有这样一个特殊方法:
__call__(self,...)
该方法与 init() 方法的区别可参考如下案例:
class MyClass: def __init__(self, x): self.x = x def __call__(self, y): return self.x + y obj = MyClass(10) result = obj(5) # 该实例作为一个函数被调用了 print(result) # Output: 15
-
Compose类
Composes several transforms together. This transform does not support torchscript. Please, see the note below.
Args: transforms (list of
Transform
objects): list of transforms to compose.Example:
transforms.Compose([ transforms.CenterCrop(10), transforms.PILToTensor(), transforms.ConvertImageDtype(torch.float), ])
-
ToTensor类(用得最多)
Convert a PIL Image or ndarray to tensor and scale the values accordingly.
-
ToPILImage类
-
Normalize类
Normalize a tensor image with mean and standard deviation. This transform does not support PIL Image. Given mean:
(mean[1],...,mean[n])
and std:(std[1],..,std[n])
forn
channels, this transform will normalize each channel of the inputtorch.*Tensor
i.e.,output[channel] = (input[channel] - mean[channel]) / std[channel]
.. note:: This transform acts out of place, i.e., it does not mutate the input tensor.
Args: mean (sequence): Sequence of means for each channel. std (sequence): Sequence of standard deviations for each channel. inplace(bool,optional): Bool to make this operation in-place.
-
Resize类
Resize the input image to the given size. If the image is torch Tensor, it is expected to have [..., H, W] shape, where ... means a maximum of two leading dimensions
-
CenterCrop类
transforms的用法
from torch.utils.tensorboard import SummaryWriter from torchvision import transforms from PIL import Image img_path = r"C:\Users\31058\Desktop\PyTorch 深度学习快速入门教程\数据集\hymenoptera_data\train\ants\0013035.jpg" img = Image.open(img_path) tensor_trans = transforms.ToTensor() tensor_img = tensor_trans(img) writer = SummaryWriter("logs") writer.add_image(tag="Tensor_img", img_tensor=tensor_img) # writer.add_image("Tensor_img", tensor_img) writer.close()
可以看到 tensor 数据类型中包装了反向神经网络的一些理论基础中的参数,绿色方框中的属性较为常用
常见transforms的使用
from PIL import Image from torch.utils.tensorboard import SummaryWriter from torchvision import transforms writer = SummaryWriter("logs") img = Image.open(r"dataset\train\ants\0013035.jpg")
ToTensor
# ToTensor trans_totensor = transforms.ToTensor() img_tensor = trans_totensor(img) trans_totensor(img) writer.add_image(tag="ToTensor",img_tensor=img_tensor) writer.close()
Normalize: 规范化
所谓规范化,是希望转换后的数值 x_bar 满足一定的特性,至于对数值具体如何变换,跟规范化目标有关,也就是说f()函数的具体形式,不同的规范化目标导致具体方法中函数所采用的形式不同。
意义:将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题。
深度学习中的Normalization,因为神经网络里主要有两类实体:神经元或者连接神经元的边,
所以按照规范化操作涉及对象的不同可以分为两大类:
① 一类是对第L层每个神经元的 净激活值 进行Normalization操作,
比如BatchNorm/ LayerNorm/ InstanceNorm/ GroupNorm等方法都属于这一类;
② 另外一类是对神经网络中连接相邻隐层神经元之间的边上的权重进行规范化操作,比如Weight Norm就属于这一类。
广义上讲,一般机器学习里看到的损失函数里面加入的对参数的的L1/L2等正则项,本质上也属于这第二类规范化操作。
L1正则的规范化目标是造成参数的稀疏化,就是争取达到让大量参数值取得0值的效果,
而L2正则的规范化目标是有效减小原始参数值的大小。
有了这些规范目标,通过具体的规范化手段来改变参数值,以达到避免模型过拟合的目的。
引用自:深度学习基础知识(三)--- Normalization 规范化 操作_深度学习normalize-CSDN博客
# Normalize print(img_tensor[0][0][0]) trans_norm = transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5]) # 0.5是人为假定的 img_norm = trans_norm(img_tensor) print(img_norm[0][0][0]) writer.add_image(tag="Normalize",img_tensor=img_norm) writer.close()
Resize
# Resize trans_resize = transforms.Resize((512,512)) img_resize = trans_resize(img) # img PIL -> resize -> img PIL -> totensor -> tensor img_resize = trans_totensor(img_resize) writer.add_image(tag="Resize",img_tensor=img_resize,global_step=0) writer.close()
Compose
trans_resize_2 = transforms.Resize(512) # 参数可以是元组:(H,W); eg:(500,1000) # 注意数据类型是多个 transforms,并且都处于一个列表之中,按照顺序执行流程 trans_compose = transforms.Compose([trans_resize_2,trans_totensor]) img_resize_2 = trans_compose(img) writer.add_image(tag="Resize",img_tensor=img_resize_2,global_step=1) writer.close()
RandomCrop
trans_random = transforms.RandomCrop(512) trans_compose_2 = transforms.Compose([trans_random,trans_totensor]) for i in range(10): img_crop = trans_compose_2(img) writer.add_image(tag="RandomCrop",img_tensor=img_crop,global_step=i) writer.close()
遇事不决,看源代码~~