PyTorch:如何在迁移学习教程中计算均值和标准差?

PyTorch: How do the means and stds get calculated in the Transfer Learning tutorial?

我正在阅读 PyTorch 迁移学习教程:link

在数据增强阶段,有以下步骤对图像进行归一化:

transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

我能理解为什么要这样做,但我找不到均值和标准值是如何计算的?我试图计算火车数据集的平均值,平均值为:

array([ 0.11727478,  0.04542569, -0.28624609], dtype=float32)

我觉得你的数字不对;因为 ToTensor transform 的输出在 [0.0, 1.0] 范围内,所以不可能得到负均值。

如果我用

计算平均值
traindata = datasets.ImageFolder(data_dir + '/train', transforms.ToTensor())
image_means = torch.stack([t.mean(1).mean(1) for t, c in traindata])
image_means.mean(0)

我得到 (0.5143, 0.4760, 0.3487) 和验证集 (0.5224, 0.4799, 0.3564)。这些更接近教程中的数字。搜索具体的数字,你会看到它们出现在 Imagenet example 中,所以我的猜测是它们是 Imagenet 数据集的均值,教程数据集是该数据集的一个子集。

您可以通过遍历所有图像来计算整个数据集的均值和标准差。那样

你需要 PyTorch 和 Torchvision

torch~=1.8.0
torchvision~=0.9.0

代码

import torch
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

train_set = torchvision.datasets.ImageFolder(
    root='/Path/',
    transform=transforms.Compose([
        transforms.ToTensor()
    ])
)

loader = DataLoader(train_set, batch_size=1, num_workers=4)
print(loader)
data = next(iter(loader))
print("Mean", data[0].mean())
print("Std",  data[0].std())
def get_mean_std(loader):
    mean = 0.
    std = 0.
    for images, _ in loader:
        batch_samples = images.size(0) # batch size (the last batch can have smaller size!)
        images = images.view(batch_samples, images.size(1), -1)
        mean += images.mean(2).sum(0)
        std += images.std(2).sum(0)

    mean /= len(loader.dataset)
    std /= len(loader.dataset)
    return mean, std