Torchvision 规范化 - 它如何对 means/sds 的元组进行操作?
Torchvision normalize - how it operates on tuple of means/sds?
我不明白这个转换是如何从 torchvision 进行的。最终我想构建一个自定义规范化 class 所以我需要先弄清楚它是如何工作的。
在文档中,它是这样描述 init 的:
def __init__(self, mean, std, inplace=False):
self.mean = mean
self.std = std
self.inplace = inplace
当我通常传递这些参数时(不是自定义 class),我将它们作为每个通道的列表或元组传递:
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
但是如果我看电话:
return F.normalize(tensor, self.mean, self.std, self.inplace)
所有这些将元组传递给的是 F.normalize(),它只接受 p 参数的单个值。
class 必须以某种方式遍历渠道以实现这一点,但它是如何做到的以及我如何在自定义中实现它 class?
基于this tutorial,我会这样描述:
class Normalize(object):
"""Convert ndarrays in sample to Tensors."""
def __init__(self, mean, std, inplace=False):
self.mean = mean
self.std = std
self.inplace = inplace
def __call__(self, sample):
image, landmarks = sample['image'], sample['landmarks']
return {'image': F.normalize(image, self.mean, self.std, self.inplace),
'landmarks': landmarks}
但这不起作用,因为它没有经过每个通道。
里面调用的normalize
函数就是这个https://github.com/pytorch/vision/blob/master/torchvision/transforms/functional.py#L191
输入是形状为 (C, H, W)
和 mean
和 std
的张量可以是序列,在内部转换为张量。标准化是通过广播 in this way:
完成的
tensor.sub_(mean[:, None, None]).div_(std[:, None, None])
我不明白这个转换是如何从 torchvision 进行的。最终我想构建一个自定义规范化 class 所以我需要先弄清楚它是如何工作的。
在文档中,它是这样描述 init 的:
def __init__(self, mean, std, inplace=False):
self.mean = mean
self.std = std
self.inplace = inplace
当我通常传递这些参数时(不是自定义 class),我将它们作为每个通道的列表或元组传递:
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
但是如果我看电话:
return F.normalize(tensor, self.mean, self.std, self.inplace)
所有这些将元组传递给的是 F.normalize(),它只接受 p 参数的单个值。
class 必须以某种方式遍历渠道以实现这一点,但它是如何做到的以及我如何在自定义中实现它 class?
基于this tutorial,我会这样描述:
class Normalize(object):
"""Convert ndarrays in sample to Tensors."""
def __init__(self, mean, std, inplace=False):
self.mean = mean
self.std = std
self.inplace = inplace
def __call__(self, sample):
image, landmarks = sample['image'], sample['landmarks']
return {'image': F.normalize(image, self.mean, self.std, self.inplace),
'landmarks': landmarks}
但这不起作用,因为它没有经过每个通道。
里面调用的normalize
函数就是这个https://github.com/pytorch/vision/blob/master/torchvision/transforms/functional.py#L191
输入是形状为 (C, H, W)
和 mean
和 std
的张量可以是序列,在内部转换为张量。标准化是通过广播 in this way:
tensor.sub_(mean[:, None, None]).div_(std[:, None, None])