(pytorch) 我想将 [0 255] 整数张量归一化为 [0 1] 浮点张量



我想将 [0 255] 整数张量规范化为 [0 1] 浮点张量。

我使用了cifar10数据集,并想处理整数图像张量。
所以我把它们做成整数张量 当我加载数据集时,我使用了"转换。ToTensor((",因此值设置为 [0 1] 浮点

tensor([[[0.4588, 0.4588, 0.4588,  ..., 0.4980, 0.4980, 0.5020],
[0.4706, 0.4706, 0.4706,  ..., 0.5098, 0.5098, 0.5137],
[0.4824, 0.4824, 0.4824,  ..., 0.5216, 0.5216, 0.5294],
...,
[0.3098, 0.3020, 0.2863,  ..., 0.4549, 0.3608, 0.3137],
[0.2902, 0.2902, 0.2902,  ..., 0.4431, 0.3333, 0.3020],
[0.2706, 0.2941, 0.2941,  ..., 0.4157, 0.3529, 0.3059]],
[[0.7725, 0.7725, 0.7725,  ..., 0.7569, 0.7569, 0.7608],
[0.7765, 0.7765, 0.7765,  ..., 0.7608, 0.7608, 0.7686],
[0.7765, 0.7765, 0.7765,  ..., 0.7608, 0.7608, 0.7725],
...,
[0.6510, 0.6314, 0.6078,  ..., 0.6941, 0.6510, 0.6392],
[0.6314, 0.6235, 0.6118,  ..., 0.6784, 0.6196, 0.6275],
[0.6157, 0.6235, 0.6157,  ..., 0.6549, 0.6431, 0.6314]],

使它们成为[0 255]整数张量。

temp = np.floor(temp_images*256)
temp_int = torch.tensor(temp, dtype=torch.int32)
temp_images = torch.clamp(temp, 0, 255)

结果是

torch.IntTensor
tensor([[[[ 94., 100., 100.,  ...,  98., 100., 102.],
[ 86., 100., 101.,  ...,  83.,  91., 103.],
[ 90., 100.,  99.,  ...,  80.,  66.,  86.],
...,
[ 92.,  92.,  90.,  ...,  77., 107., 119.],
[ 76.,  91., 100.,  ...,  95., 158., 170.],
[ 86.,  83.,  87.,  ...,  97., 176., 205.]],
[[105., 111., 111.,  ..., 109., 112., 113.],
[ 97., 111., 112.,  ...,  94., 102., 114.],
[101., 111., 110.,  ...,  90.,  77.,  97.],
...,
[111., 110., 108.,  ...,  88., 120., 131.],
[ 95., 108., 114.,  ..., 105., 165., 172.],
[106., 100., 101.,  ..., 108., 183., 206.]],
[[ 62.,  68.,  68.,  ...,  66.,  68.,  70.],
[ 55.,  69.,  70.,  ...,  51.,  59.,  71.],
[ 59.,  69.,  68.,  ...,  48.,  34.,  54.],
...,
[ 59.,  59.,  56.,  ...,  54.,  95., 107.],
[ 49.,  61.,  66.,  ...,  76., 152., 166.],
[ 61.,  55.,  54.,  ...,  73., 170., 206.]]],

在将它们转发到网络之前, 我想让它们再次浮点张量 [0 1]。

所以我尝试了

transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))

但是,结果没有归一化为 [0 1],而是变得更大...!

tensor([[[117., 117., 117.,  ..., 127., 127., 128.],
[120., 120., 120.,  ..., 130., 130., 131.],
[123., 123., 123.,  ..., 133., 133., 135.],
...,
[ 79.,  77.,  73.,  ..., 116.,  92.,  80.],
[ 74.,  74.,  74.,  ..., 113.,  85.,  77.],
[ 69.,  75.,  75.,  ..., 106.,  90.,  78.]],
[[197., 197., 197.,  ..., 193., 193., 194.],
[198., 198., 198.,  ..., 194., 194., 196.],
[198., 198., 198.,  ..., 194., 194., 197.],

tensor([[[233., 233., 233.,  ..., 253., 253., 255.],
[239., 239., 239.,  ..., 259., 259., 261.],
[245., 245., 245.,  ..., 265., 265., 269.],
...,
[157., 153., 145.,  ..., 231., 183., 159.],
[147., 147., 147.,  ..., 225., 169., 153.],
[137., 149., 149.,  ..., 211., 179., 155.]],
[[393., 393., 393.,  ..., 385., 385., 387.],
[395., 395., 395.,  ..., 387., 387., 391.],
[395., 395., 395.,  ..., 387., 387., 393.],
...,
[331., 321., 309.,  ..., 353., 331., 325.],
[321., 317., 311.,  ..., 345., 315., 319.],
[313., 317., 313.,  ..., 333., 327., 321.]],

如何将 [0 255] 整数张量归一化为 [0 1] 浮点张量?

问题是你似乎误解了transforms.Normalize做什么。引用 PyTorch 文档:

使用平均值和标准偏差对张量图像进行归一化。给定平均值:(M1,...,Mn)和标准:(S1,..,Sn)对于n通道,这种转换将 归一化输入torch.*Tensor的每个通道,即input[channel] = (input[channel] - mean[channel]) / std[channel]

您提供的100和 std 和平均值的值的计算将是:100 - 0.5 / 0.5 = 199。 当然,您可以增加性病和平均值,但这并不能保证您可能期望的确切结果。 正如评论中所建议的,最好的方法可能是反转您执行的操作,以便首先使张量[0 255]

编辑:
事实证明,根据这篇论坛帖子,似乎从 PIL 图像到张量的转换会自动将您的值范围转换为[0 1](如果您分别转换为PIL 图像,则转换为[0 255](,如transforms.ToTensor的细则中所写。对于返回转换,它没有明确说明,但可以通过mode强制执行。

最新更新