python - 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 来保持理智,但很快就会使用我自己独特的数据集,并且可能需要我自己的规范化。
解决方案
在 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] 范围内转换您的数据
推荐阅读
- python - LDAP 可扩展匹配过滤器 LDAP_MATCHING_RULE_IN_CHAIN
- php - Laravel Eloquent - 从只有一个孩子的父母那里获得结果
- pandas - 更快的出栈方式
- cmd - 我需要搜索一些目录以查找 DAV 文件,如果有触发任务
- nginx - 错误后退在 nginx pod 中重新启动失败的容器
- jupyter-notebook - 在 Jupyter Notebook 中正确换行的正确配置选项是什么?
- reactjs - 从状态初始化的 react-final-form 中带有 react-select 的条件下拉列表
- macos - 有没有办法自动化内置在颜色选择器中的操作系统?
- angular - 作为对象接收的角度数据
- python - 如何在 Python 中查找字符串中的偶数