当我想将张量归一化到0到1的范围时,应该使用什么样的均值和标准差?但我处理的图像只有2个通道(a、b通道 -> -128到127),而不是3个通道。因此,通常的mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]
无法满足需求。
transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])
这导致了以下错误信息:
tensor.sub_(mean[:, None, None]).div_(std[:, None, None])
RuntimeError: The size of tensor a (2) must match the size of tensor b(3) at non-singleton dimension 0
回答:
如你所见,PyTorch抱怨张量的大小,因为你缺少一个通道。
此外,这些“常用”的均值和标准差值是在ImageNet数据集上计算的,如果你的数据统计特性与该数据集相匹配,这些值是有用的。
由于你只处理两个通道,我假设你的领域可能与3通道自然图像有很大不同。在这种情况下,我会简单地使用0.5
作为mean
和std
的值,这样最小值0将被转换为(0 - 0.5) / 0.5 = -1
,最大值1将被转换为(1 - 0.5) / 0.5 = 1
。
transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5], std=[0.5, 0.5])])
编辑:我建议对输入进行零中心化处理。
然而,如果出于某些原因你必须将其范围保持在[0, 1]之间,仅调用ToTensor()
就足够了。
在这种情况下,需要注意的是,我认为ToTensor()
假设你的输入范围在[0, 255] 进行变换前,因此它基本上是将输入除以255。如果在你的领域中并非如此(例如,你的输入总是处于[1, 50]范围内),我建议你创建一个自定义变换,以便根据你的数据的实际上限进行除法操作。