我们经常看到:
transform = transforms.Compose([
transforms.RandomResizedCrop(100),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
这里使用的mean= [ 0.485,0.456,0.406 ]和STD=[ 0.229,0.224,0.225 ]进行归一化.
这里的数字是在预训练模型训练的时候采用的格式,我们需要和预训练模型保持相同的格式。
同时在pytorch官方介绍中说明了预训练模型都是采用【0,1】标准分布的图像训练。
以下是pytorch的样例所使用的mean和std
https://github.com/pytorch/examples/tree/42e5b996718797e45c46a25c55b031e6768f8440
附上计算mean和std的代码:
transform = transforms.Compose([
transforms.ToPILImage(),
transforms.ToTensor()
])
dataloader = torch.utils.data.DataLoader(*torch_dataset*, batch_size=4096, shuffle=False, num_workers=4)
pop_mean = []
pop_std0 = []
pop_std1 = []
for i, data in enumerate(dataloader, 0):
# shape (batch_size, 3, height, width)
numpy_image = data['image'].numpy()
# shape (3,)
batch_mean = np.mean(numpy_image, axis=(0,2,3))
batch_std0 = np.std(numpy_image, axis=(0,2,3)) ##总体方差
batch_std1 = np.std(numpy_image, axis=(0,2,3), ddof=1) ##样本方差
pop_mean.append(batch_mean)
pop_std0.append(batch_std0)
pop_std1.append(batch_std1)
# shape (num_iterations, 3) -> (mean across 0th axis) -> shape (3,)
pop_mean = np.array(pop_mean).mean(axis=0)
pop_std0 = np.array(pop_std0).mean(axis=0)
pop_std1 = np.array(pop_std1).mean(axis=0)
计算出来只需要添加即可:
transform = transforms.Compose([
transforms.ToPILImage(),
transforms.ToTensor(),
transforms.Normalize(mean=*your_calculated_mean*, std=*your_calculated_std*)
])
分batch计算mean,再取平均。