pytorch计算机视觉——计算图片数据集的标准差和平均值
8 个月前
· 来自专栏
pytorch_cv学习笔记
问题动机
在训练模型以前,对数据进行预处理,往往能够:(1)加快训练模型时的收敛速度;(2)减少异常值对模型的影响。数据标准化即是预处理中较为关键的一步,具体而言,即是通道的每个值减去该通道的平均值,然后将结果除以该通道的标准差。那么如何计算平均值和标准差?
通常我们在看cv代码的时候,标准化函数的值通常指定成以下格式:
normalize = torchvision.transforms.Normalize(
[0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
这个值是从哪里来的呢?这是在百万张图像上计算而得的,所以我们通常见到在训练过程中使用它们做标准化[1]。针对一些特殊的数据集,这对数值可能不适用,那么就需要我们自己计算。
解决方法
import torch
import torchvision
def getMeanAndBias(dataset):
iter_dataloader 要求:元素为tensor类型、转换为torch.utils.data.Dataset类
# 1. dataloader加载数据
# 注意batch_size的用法。这种条件下,数据集会被逐样本分割,而不是成批在一起
data_iter = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, num_workers=0)
# 2. 初始化通道平均值和标准差
means = torch.zeros(3)
bias = torch.zeros(3)
# 3. 计算每张图片的每个通道的平均值和以及方差和
for img, _ in data_iter:
for d in range(3):
# 注意针对单个通道计算平均值和标准差的方法
means[d] += img[:, d, :, :].mean()
bias[d] += img[:, d, :, :].std()
means = means / len(data_iter)
bias = bias / len(data_iter)
return [means, bias]
实验效果
我们调用这个API试试效果
# 注意要设计转换器,将元素转换为tensor类型
transfroms = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])