PyTorch:如何在Transfer Learning教程中计算平均值和stds?

时间:2018-02-16 00:49:42

标签: python pytorch

我正在浏览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)

3 个答案:

答案 0 :(得分:6)

你的号码对我来说似乎不合适;由于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数据集的平均值,其中教程数据集是子集。

答案 1 :(得分:0)

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

你需要 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())

答案 2 :(得分:0)

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