首页 > 解决方案 > torch.transforms.normalize 中的数字是多少以及如何选择它们?

问题描述

我正在关注 一些 教程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 来保持理智,但很快就会使用我自己独特的数据集,并且可能需要我自己的规范化。

标签: pythonmachine-learningdeep-learningpytorchmnist

解决方案


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

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

之后,您希望输入图像的值在 [0,1] 或 [-1,1] 之类的范围内,以帮助您的模型收敛到正确的方向(发生缩放的许多原因,例如 NN 更喜欢该范围内的输入以避免梯度饱和)。现在您可能注意到在 Normalize 中传递 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] 范围内转换您的数据


推荐阅读