【问题标题】:PyTorch: How do the means and stds get calculated in the Transfer Learning tutorial?PyTorch:迁移学习教程中的均值和标准差是如何计算的?
【发布时间】:2018-07-26 21:09:25
【问题描述】:

我正在阅读 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)

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    我觉得你的数字不对;由于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数据集的手段,教程数据集是其中的一个子集。

    【讨论】:

    • 谢谢,我试图计算归一化数据的平均值,因此是负平均值。现在这是有道理的。如果作者可以在教程中添加一行注释来说明为什么要使用这些值,那就更清楚了。
    • 嘿,我使用的是完全相同的逻辑,但出于某种奇怪的原因,它给了我一个错误,指出数字不在范围内。提到的数字是数据集本身的长度,我猜这意味着它试图以某种方式将该长度用作索引。你知道什么会导致这个问题吗? @nnnmmm
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 2016-04-03
        • 2019-01-30
        • 2018-11-30
        • 2014-03-21
        • 2019-03-04
        • 2021-11-04
        • 2019-06-07
        相关资源
        最近更新 更多