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