理解torchvision中 transforms.Normalize()

数据归一化处理transforms.Normalize()
1. 图像预处理Transforms(主要讲解数据标准化)
1.1 理解torchvision
transforms属于torchvision模块的方法,它是常见的图像预处理的方法
在这里贴上别人整理的transforms运行机制:

在这里插入图片描述

 

可以看出torchvision工具包中包含三个主要模块,主要讲解学习transforms

torchvision.transforms:常用的数据预处理方法,提升泛化能力
包括:数据中心化、数据标准化、缩放、裁剪、旋转、翻转、填充、噪声添加、灰度变换、线性变换、仿射变换、亮度、饱和度及对比度变换等

1.2 数据标准化——transforms.normalize()
功能:逐channel的对图像进行标准化(均值变为0,标准差变为1),可以加快模型的收敛
output = (input - mean) / std
mean:各通道的均值
std:各通道的标准差
inplace:是否原地操作
思考:
(1)据我所知,归一化就是要把图片3个通道中的数据整理到[-1, 1]区间。
x = (x - mean(x))/std(x)
只要输入数据集x确定了,mean(x)和std(x)也就是确定的数值了,为什么Normalize()函数还需要输入mean和std的数值呢????

(2)RGB单个通道的值是[0, 255],所以一个通道的均值应该在127附近才对。
如果Normalize()函数去计算 x = (x - mean)/std ,因为RGB是[0, 255],算出来的x就不可能落在[-1, 1]区间了。

(3)在我看的了论文代码里面是这样的:
torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
为什么就确定了这一组数值,这一组数值是怎么来的? 为什么这三个通道的均值都是小于1的值呢?
理解:
(1)针对第一个问题,mean 和 std 肯定要在normalize()之前自己先算好再传进去的,不然每次normalize()就得把所有的图片都读取一遍算这两个
(2)针对第二个问题,有两种情况
(a )如果是imagenet数据集,那么ImageNet的数据在加载的时候就已经转换成了[0, 1].
(b) 应用了torchvision.transforms.ToTensor,其作用是将数据归一化到[0,1](是将数据除以255),transforms.ToTensor()会把HWC会变成C *H *W(拓展:格式为(h,w,c),像素顺序为RGB)
(3)针对第三个问题:[0.485, 0.456, 0.406]这一组平均值是从imagenet训练集中抽样算出来的。
继续有疑问:
ToTensor 已经[0,1]为什么还要[0.485, 0.456, 0.406]?那么归一化后为什么还要接一个Normalize()呢?Normalize()是对数据按通道进行标准化,即减去均值,再除以方差
解答:
别人的解答:数据如果分布在(0,1)之间,可能实际的bias,就是神经网络的输入b会比较大,而模型初始化时b=0的,这样会导致神经网络收敛比较慢,经过Normalize后,可以加快模型的收敛速度。
因为对RGB图片而言,数据范围是[0-255]的,需要先经过ToTensor除以255归一化到[0,1]之后,再通过Normalize计算过后,将数据归一化到[-1,1]。
是否可以这样理解:
[0,1]只是范围改变了, 并没有改变分布,mean和std处理后可以让数据正态分布😂
参考:
pytorch torchvision.transforms.Normalize()中的mean和std参数—解惑
pytorch的transform中ToTensor接着Normalize
另外这篇包含数据增强部分:
Pytorch框架学习(6)——transforms与normalize
拓展:
数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。


本文出自链接:https://blog.csdn.net/qq_38765642/article/details/109779370

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

Torchvision 是 PyTorch 的一个扩展库,用于图像处理和计算机视觉任务。它提供了许多常用的数据集、模型、图像变换等功能,同时还提供了一些可视化工具,方便我们查看和理解数据。 下面介绍几种常用的 Torchvision 可视化方法: 1. 可视化数据集 Torchvision 提供了许多常见的数据集,如 MNIST、CIFAR-10、COCO 等。我们可以通过以下代码可视化 MNIST 数据集的一些样本: ```python import torchvision import matplotlib.pyplot as plt # 加载 MNIST 数据集 trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=None) # 可视化数据集的前 10 张图片 fig, axs = plt.subplots(1, 10, figsize=(15, 5)) for idx in range(10): img, target = trainset[idx] axs[idx].imshow(img, cmap='gray') axs[idx].set_title(str(target)) axs[idx].axis('off') plt.show() ``` 2. 可视化模型输出 在训练模型时,我们经常需要查看模型的输出结果,以判断模型是否正确地学习到了数据的特征。可以使用 `torchvision.utils.make_grid()` 函数将模型输出的多张图片拼接成一张大图,方便我们直观地观察模型的学习效果。 以下是一个将模型输出的前 16 张图片可视化的示例代码: ```python import torch import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt # 加载 CIFAR-10 数据集并进行预处理 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) # 加载训练好的模型 net = Net() net.load_state_dict(torch.load(PATH)) # 获取模型输出的前 16 张图片 dataiter = iter(trainloader) images, labels = dataiter.next() outputs = net(images) # 将模型输出的多张图片拼接成一张大图 img_grid = torchvision.utils.make_grid(images[:16], nrow=4) # 可视化大图 plt.imshow(img_grid.permute(1, 2, 0)) plt.show() ``` 3. 可视化特征图 在卷积神经网络,每层卷积操作的输出都是一组特征图。我们可以使用 `torchvision.utils.make_grid()` 函数将特征图拼接成一张大图,从而观察不同卷积层的特征图。 以下是一个将模型不同卷积层的特征图可视化的示例代码: ```python import torch import torchvision import matplotlib.pyplot as plt # 加载 CIFAR-10 数据集并进行预处理 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) # 加载训练好的模型 net = Net() net.load_state_dict(torch.load(PATH)) # 提取指定层的特征图 conv_layers = [] for name, layer in net.named_modules(): if isinstance(layer, nn.Conv2d): conv_layers.append(name) outputs = [] for name in conv_layers: x = images for n, l in net.named_modules(): if n == name: x = l(x) outputs.append(x) # 将特征图拼接成一张大图 img_grid = torchvision.utils.make_grid(outputs, nrow=len(conv_layers)) # 可视化大图 plt.imshow(img_grid.permute(1, 2, 0)) plt.show() ``` 以上就是几种常用的 Torchvision 可视化方法。需要注意的是,在可视化特征图时,我们需要提前指定要可视化的卷积层,并通过模型的 `named_modules()` 函数获取该层的输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值