python - Torchvision 0.2.1 变换。Normalize 未按预期工作

标签 python deep-learning pytorch normalize torchvision

我正在尝试使用 Pytorch 编写新代码。在此代码中,为了加载数据集(CIFAR10),我使用了 torchvision 的数据集。我定义了两个变换函数 ToTensor() 和 Normalize()。标准化后,我预计数据集中的数据应在 0 和 1 之间。但最大值仍然是 255。我还在 Transforms.py 中 Normalize 类的 '__call__' 函数中插入了一条打印语句(Lib\site-packages\torchvision\transforms\transforms.py)。运行代码时也不会打印此打印内容。不确定发生了什么。我在互联网上访问的每个页面都以几乎与我相同的方式提到了用法。例如我访问过的一些网站 https://github.com/adventuresinML/adventures-in-ml-code/blob/master/pytorch_nn.py https://github.com/pytorch/tutorials/blob/master/beginner_source/blitz/cifar10_tutorial.py

我的代码如下。这会读取带有和不带有标准化的数据集,然后打印一些统计数据。打印的最小值和最大值是数据是否标准化的指标。

import torchvision as tv
import numpy as np

dataDir = 'D:\\general\\ML_DL\\datasets\\CIFAR'

trainTransform  = tv.transforms.Compose([tv.transforms.ToTensor()])
trainSet        = tv.datasets.CIFAR10(dataDir, train=True, download=False, transform=trainTransform)
print (trainSet.train_data.mean(axis=(0,1,2))/255)
print (trainSet.train_data.min())
print (trainSet.train_data.max())
print (trainSet.train_data.shape)

trainTransform  = tv.transforms.Compose([tv.transforms.ToTensor(), tv.transforms.Normalize((0.4914, 0.4822, 0.4466), (0.247, 0.243, 0.261))])
trainSet        = tv.datasets.CIFAR10(dataDir, train=True, download=False, transform=trainTransform)
print (trainSet.train_data.mean(axis=(0,1,2))/255)
print (trainSet.train_data.min())
print (trainSet.train_data.max())
print (trainSet.train_data.shape)

输出看起来像,

[ 0.49139968  0.48215841  0.44653091]
0
255
(50000, 32, 32, 3)
[ 0.49139968  0.48215841  0.44653091]
0
255
(50000, 32, 32, 3)

请帮助我更好地理解这一点。由于我尝试过的大多数功能最终都会得到类似的结果 - 例如 Grayscale、CenterCrop 也是如此。

最佳答案

因此,您在代码中制定了一个计划,说明您希望如何处理数据。您已经创建了一个数据管道,数据将通过该管道流动并应用多种转换。

但是,您忘记调用torch.utils.data.DataLoader。在调用此方法之前,不会应用对数据的转换。您可以阅读更多相关信息here .

现在,当我们将上述内容添加到您的代码中时,如下所示 -

trainTransform  = tv.transforms.Compose([tv.transforms.ToTensor(), 
                  tv.transforms.Normalize((0.4914, 0.4822, 0.4466), (0.247, 0.243, 0.261))])

trainSet = tv.datasets.CIFAR10(root=dataDir, train=True,
                                    download=False, transform=trainTransform)

dataloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=False, num_workers=4)

和打印图像如下 -

images, labels = iter(dataloader).next()
print images
print images.max()
print images.min()

我们得到具有我们已应用的变换的张量

输出的一小段

[[ 1.8649,  1.8198,  1.8348,  ...,  0.3924,  0.3774,  0.2572],
      [ 1.9701,  1.9550,  1.9851,  ...,  0.7230,  0.6929,  0.6629],
      [ 2.0001,  1.9550,  2.0001,  ...,  0.7831,  0.7530,  0.7079],
      ...,
      [-0.8096, -1.0049, -1.0350,  ..., -1.3355, -1.3655, -1.4256],
      [-0.7796, -0.8697, -0.9749,  ..., -1.2754, -1.4557, -1.5609],
      [-0.7645, -0.7946, -0.9298,  ..., -1.4106, -1.5308, -1.5909]]]])
tensor(2.1309)
tensor(-1.9895) 

其次,transforms.Normalize(mean,std)适用input[channel] = (input[channel] -mean[channel])/std[channel]所以根据我们提供的平均值和标准差,我们无法得到转换后在(0,1)范围内的值。如果您想要 (-1,1) 之间的值,您可以使用以下 -

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

希望对您有帮助! :)

关于python - Torchvision 0.2.1 变换。Normalize 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53332663/

相关文章:

tensorflow - 如何在使用 Keras 或 Tensorflow 训练深度神经网络期间添加更多数据

machine-learning - 随着批量大小的变化,学习率应该如何变化?

python - 为什么在 Pi 的整数倍处 torch.sin() 和 numpy.sin() 的评估存在数量级?

pytorch - torch.where 中的标量类型?

pytorch - torch.distributed.barrier() 如何工作

python - pyspark 将数据帧写入 hdfs 失败

python - 通过交替具有多个部分和精确模式的正则表达式

python - SURF 未绑定(bind)在 opencv-python 中?

python - 如何在 Tensorflow 中实现逐元素一维插值?

python - 尝试在我的 Mac OS (Catalina) 上安装 AWS CLI