Pytorch cifar10 图像未归一化
Pytorch cifar10 images are not normalized
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainset.data[0]
我正在使用上面的代码并期望数据被规范化。但事实并非如此,下面是结果。我需要使用数据方法访问数据以进行更多处理。输出如下。
array([[[ 59, 62, 63],
[ 43, 46, 45],
[ 50, 48, 43],
...,
[158, 132, 108],
[152, 125, 102],
[148, 124, 103]],
torchvision.transforms.Normalize
只是一个 shift-scale 运算符。给定参数mean
("shift"
)和std
("scale"
),它会将输入映射到(input - shift) / scale
.
由于您在所有三个通道上都使用了 mean=0.5
和 std=0.5
,结果 (input - 0.5) / 0.5
如果其统计数据实际上是 mean=0.5
,则仅对数据进行归一化] 和 std=0.5
当然不是这样。
考虑到这一点,您应该做的是提供实际数据集的统计信息。对于 CIFAR10,例如可以找到 here:
mean = [0.4914, 0.4822, 0.4465]
std = [0.2470, 0.2435, 0.2616]
使用这些值,您将能够将数据正确规范化为 mean=0
和 std=1
。
我写了一个更笼统的长篇回答 。
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainset.data[0]
我正在使用上面的代码并期望数据被规范化。但事实并非如此,下面是结果。我需要使用数据方法访问数据以进行更多处理。输出如下。
array([[[ 59, 62, 63],
[ 43, 46, 45],
[ 50, 48, 43],
...,
[158, 132, 108],
[152, 125, 102],
[148, 124, 103]],
torchvision.transforms.Normalize
只是一个 shift-scale 运算符。给定参数mean
("shift"
)和std
("scale"
),它会将输入映射到(input - shift) / scale
.
由于您在所有三个通道上都使用了 mean=0.5
和 std=0.5
,结果 (input - 0.5) / 0.5
如果其统计数据实际上是 mean=0.5
,则仅对数据进行归一化] 和 std=0.5
当然不是这样。
考虑到这一点,您应该做的是提供实际数据集的统计信息。对于 CIFAR10,例如可以找到 here:
mean = [0.4914, 0.4822, 0.4465]
std = [0.2470, 0.2435, 0.2616]
使用这些值,您将能够将数据正确规范化为 mean=0
和 std=1
。
我写了一个更笼统的长篇回答