在pytorch中学习之前对图像进行规范化

时间:2018-12-12 03:53:13

标签: python-3.x image machine-learning normalization pytorch

我想在pytorch中学习之前应用变换来标准化我的数据集中的图像。我听说这极大地改善了学习。我认为Pytorch默认将所有图像像素值除以255,然后再将它们按张量推入点数,这是否会对标准化造成问题?在线指南建议我们按照以下方式进行操作。

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

但是,这里的0.5只是我发现的一个例子,不是我的数据通道的均值或方差。

所以我的问题是如何得出均值和标准差?我们是否需要展平并附加输入图片的所有绿色像素值,然后计算平均值和标准偏差?然后为所有其他颜色重复。那是怎么做的?

我听说还有另一种方法试图计算要标准化的“平均图片”。结果有什么不同?

1 个答案:

答案 0 :(得分:0)

运行此代码以获取均值,标准偏差,自由度为1的标准偏差的值。

transform = transforms.Compose([
    transforms.ToPILImage(),
    transforms.ToTensor()
])

dataloader = torch.utils.data.DataLoader(*torch_dataset*, batch_size=4096, shuffle=False, num_workers=4)

data_mean = [] # Mean of the dataset
data_std0 = [] # std of dataset
data_std1 = [] # std with ddof = 1
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)

    data_mean.append(batch_mean)
    data_std0.append(batch_std0)
    data_std1.append(batch_std1)

# shape (num_iterations, 3) -> (mean across 0th axis) -> shape (3,)
data_mean = np.array(data_mean).mean(axis=0)
data_std0 = np.array(data_std0).mean(axis=0)
data_std1 = np.array(data_std1).mean(axis=0)