我想在pytorch中学习之前应用变换来标准化我的数据集中的图像。我听说这极大地改善了学习。我认为Pytorch默认将所有图像像素值除以255,然后再将它们按张量推入点数,这是否会对标准化造成问题?在线指南建议我们按照以下方式进行操作。
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
但是,这里的0.5只是我发现的一个例子,不是我的数据通道的均值或方差。
所以我的问题是如何得出均值和标准差?我们是否需要展平并附加输入图片的所有绿色像素值,然后计算平均值和标准偏差?然后为所有其他颜色重复。那是怎么做的?
我听说还有另一种方法试图计算要标准化的“平均图片”。结果有什么不同?
答案 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)