torch.transforms.normalize 中的数字是什么以及如何选择它们?

问题描述 投票:0回答:3

我正在关注一些教程并且我不断在

transforms
部分看到不同的数字,这些数字对我来说似乎相当随意

即,

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

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

transform = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

或其他。

我想知道这些数字是从哪里出现的,以及如何知道选择正确的数字?

我即将使用 MNIST 来保持理智,但很快就会使用我自己独特的数据集,并且可能需要我自己的标准化。

python machine-learning deep-learning pytorch mnist
3个回答
14
投票

在 pytorch 上下文中标准化,从每个实例(在您的例子中为 MNIST 图像)减去平均值(第一个数字)并除以标准差(第二个数字)。这对每个通道分别进行,这意味着在 mnist 中你只需要 2 个数字,因为图像是灰度的,但是在 cifar10 上,它有彩色图像,你将使用与最后一个 sform 类似的东西(3 个数字表示平均值,3 个数字表示标准差) ).

所以基本上 MNIST 中的每个输入图像都会从 [0,255] 转换为 [0,1],因为你将图像转换为张量(来源:https://pytorch.org/docs/stable/torchvision/transforms.html - - 如果 PIL 图像属于,则将 [0, 255] 范围内的 PIL 图像或 numpy.ndarray (H x W x C) 转换为 [0.0, 1.0] 范围内形状 (C x H x W) 的 torch.FloatTensor模式之一(L、LA、P、I、F、RGB、YCbCr、RGBA、CMYK、1)或者如果 numpy.ndarray 的 dtype = np.uint8)

之后,您希望输入图像的值在 [0,1] 或 [-1,1] 范围内,以帮助您的模型收敛到正确的方向(发生缩放的原因有很多,例如神经网络更喜欢围绕该范围的输入)范围以避免梯度饱和)。现在,您可能注意到在标准化中传递 0.5 和 0.5 会产生范围内的值:

输入图像的最小值 = 0 -> 0-0.5 = -0.5 -> 除以 0.5 std -> -1

输入图像的最大值 = 255 -> toTensor -> 1 -> (1 - 0.5) / 0.5 -> 1

因此它会在 [-1, 1] 范围内转换您的数据


0
投票

我在这个问题上坐了一个小时,并意识到,在这种情况下:

变换 = 变换.Compose([变换.ToTensor(), 变换.Normalize((0.5,), (0.5,))])

当我们操作范围为 [0,255] 的图像像素时,transforms.toTensor() 方法会将 PIL 对象转换为 [0,1] 比例,因此 [0,255]->[0,1]。

方法transforms.Normalize((0.5,),(0.5,)通过执行(input-0.5)/0.5将[0,1]的数据归一化为[-1,1]尺度,所以[0,1]- >[-1,1]

简单考虑这个张量:

[[255,0],[100,255]]

所以transforms.toTensor()会做-> [[255/(255-0),0],[100/(255-0),255/(255-0)]]

=[[1,0],[0.392,1]]

然后transforms.Normalize会做-> [[(1-0.5)/0.5,(0-0.5)/0.5],[(0.392-0.5)/0.5,(1-0.5)/0.5]]

=[[1,-1],[-0.21,1]]


-2
投票

这些具体数字

(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

取自 ImageNet 数据集,因为模型通常在其上进行预训练

© www.soinside.com 2019 - 2024. All rights reserved.