pytorch 归一化和缩放MNIST数据集的正确方法

5n0oy7gb  于 2023-02-04  发布在  其他
关注(0)|答案(4)|浏览(280)

我到处都找过了,但是没有找到我想要的。基本上,MNIST数据集包含像素值在[0, 255]范围内的图像。人们说,一般来说,最好执行以下操作:

  • 将数据缩放至[0,1]范围。
  • 将数据归一化,使平均值为零,单位标准差为(data - mean) / std

不幸的是,从来没有人展示过如何同时做这两件事,它们都是减去平均值0.1307,然后除以标准差0.3081,这些值基本上就是数据集的平均值和标准差除以255:

from torchvision.datasets import MNIST        
import torchvision.transforms as transforms 

trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True)
print('Min Pixel Value: {} \nMax Pixel Value: {}'.format(trainset.data.min(), trainset.data.max()))
print('Mean Pixel Value {} \nPixel Values Std: {}'.format(trainset.data.float().mean(), trainset.data.float().std()))
print('Scaled Mean Pixel Value {} \nScaled Pixel Values Std: {}'.format(trainset.data.float().mean() / 255, trainset.data.float().std() / 255))

这将输出以下内容

Min Pixel Value: 0 
Max Pixel Value: 255
Mean Pixel Value 33.31002426147461 
Pixel Values Std: 78.56748962402344
Scaled Mean: 0.13062754273414612 
Scaled Std: 0.30810779333114624

然而,很明显,这并不符合上述要求!结果数据1)不会在[0, 1]之间,也不会有平均值0或标准值1。事实上,这就是我们正在做的:
[data - (mean / 255)] / (std / 255)
和这个非常不同
[(scaled_data) - (mean/255)] / (std/255)
其中scaled_data正好是data / 255

rqqzpn5f

rqqzpn5f1#

欧拉-- solr 特
我偶然发现这个可能有点太晚了,但希望我能帮上一点忙。
假设您正在使用torchvision.Transform,则可以使用以下代码来规范化MNIST数据集。

train_loader = torch.utils.data.DataLoader(
        datasets.MNIST('./data', train=True
        transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.1307,), (0.3081,))
        ])),

通常,“transforms.ToTensor()”用于将[0,255]范围内的输入数据转换为三维Tensor。此函数自动将输入数据缩放到[0,1]范围内。(这相当于将数据缩小到0,1)
因此,“transforms.Normalize(...)”中使用的均值和标准差分别为0.1307和0.3081是合理的。(这相当于归一化零均值和单位标准差。)
请参考下面的链接以获得更好的解释。
https://pytorch.org/vision/stable/transforms.html

pftdvrlh

pftdvrlh2#

我想你误解了一个关键的概念:这是两种不同且不一致的缩放操作。2您只能使用其中之一:

  • 平均值= 0,标准差= 1
  • 数据范围[0,1]

考虑一下[0,1]范围:如果数据都是小正值,min=0,max=1,那么数据之和 * 必须 * 为正,给出正的、* 非零 * 平均值。类似地,当 * 没有 * 数据可能与平均值相差1.0时,标准差 * 不能 * 为1
相反,如果平均值=0,则某些数据 * 必须 * 为负值。
您只使用这两个转换中的一个,使用哪一个取决于您的数据集的特性,最终决定哪一个更适合您的模型。
对于[0,1]缩放,只需除以255。
对于平均值=0、标准差=1的缩放,您可以执行已知的简单线性变换:

new_val = (old_val - old_mean) / old_stdev

这对你来说是澄清了吗?还是我完全没有理解你的困惑?

8ulbf1ek

8ulbf1ek3#

目的

功能缩放的两个最重要原因是:
1.您可以缩放要素以使它们具有相同的量级(即重要性或权重)。

    • 示例**:

具有两个特征的数据集:年龄和体重。年龄以岁为单位,体重以克为单位!现在,一个20岁的小伙子体重只有60公斤,将转换为整个数据集的向量=[20岁,60000克],以此类推。体重属性将在训练过程中占主导地位。这是如何做到的,取决于您使用的算法类型-有些比其他更敏感:例如,神经网络,其中梯度下降的学习速率受到神经网络Thetas的大小(即权重)的影响,并且后者在训练过程期间与输入(即特征)相关地变化;特征缩放也提高了收敛性。另一个例子是K均值聚类算法需要相同量级的特征,因为它在空间的所有方向上都是各向同性的。INTERESTING LIST
1.缩放要素可以加快执行速度。
这很简单:所有这些矩阵乘法和参数求和,与非常大的数(或将特征乘以一些其他参数产生的非常大的数等)相比,使用小的数将更快

类型

最常用的要素缩放器类型可总结如下:

  1. StandardScaler:通常是您的第一个选项,它非常常用。它通过标准化数据(* 即居中 *)工作,也就是说,使它们成为STD=1Mean=0它会受到离群值的影响,仅当您的数据具有Gaussian-Like Distribution时才应使用。

  1. MinMaxScaler:通常用于将所有数据点置于特定范围内(* 例如[0 - 1])。***它会受到异常值的严重影响**因为它使用Range

  1. RobustScaler:它对离群值是"* 稳健 *"的,因为它根据quantile range缩放数据。但是,您应该知道离群值仍然存在于缩放后的数据中。

  1. MaxAbsScaler:主要用于sparse data

  1. Unit Normalization:它基本上将每个样本的向量缩放为具有单位范数,而与样本的分布无关。

哪一个和多少个

您需要先了解您的数据集。如上所述,您需要先了解一些事情,例如:数据分布离群值的存在***和***使用的算法
无论如何,每个数据集都需要一个定标器,除非有特定的要求,比如如果存在一个算法,只在数据在一定范围内时有效,并且的均值为零,标准差为1--所有这些都在一起。

要点

hgtggwj0

hgtggwj04#

我们使用torchvision. transforms. ToTensor()将数据缩放到[0,1],然后应用归一化(0.1306,0.3081),您可以在Pytorch文档中查看:https://pytorch.org/vision/stable/transforms.html.
希望这能回答你的问题。

相关问题