我正在尝试使用 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/