我有一个关于标准化的问题。我目前在图像数据集上使用 pytorch ResNet50 进行训练的方法如下:
第一步:我计算整个数据集的平均值和标准差,然后使用以下代码对pytorch的ImageFolder中的图像进行标准化:-
data_transform = transforms.Compose([
transforms.Resize(input_size),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(0.1,0.1,0.1),
transforms.ToTensor(),
transforms.Normalize([0.554, 0.450, 0.343],[0.231, 0.241, 0.241]),
])
data = datasets.ImageFolder(root=data_directory, transform=data_transform)
第二步:我在Pytorch中使用ResNet50进行训练,在其架构中进行批量归一化,如下图所示:-
我的问题是:
Q1)我需要两种标准化还是其中之一标准化就足够了?
Q2)选择标准化方法的原因是什么??
tl;博士两者都用,它们做不同的事情
预处理归一化和batchnorm都在做归一化操作,但作用不同。
进行预处理归一化是因为给模型“好且合理”的数字具有更好的数值稳定性。通常,将输入标准化为均值 0、方差 1 效果很好。标准化变换使用每通道均值和方差值对输入执行此操作。
请注意,如果您想使用预训练模型,则需要使用与该模型的训练数据相同的归一化参数。
Batchnorm 是模型中每层应用的归一化。 Batchnorm 跟踪激活的均值和方差,并使用这些值对它们进行标准化。 Batchnorm 通常还具有可学习的参数来移动和缩放激活(即学习正确的均值和方差)。
严格来说,batchnorm 是可选的,但它往往会改进模型。