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