【问题标题】:Torchvision normalize - how it operates on tuple of means/sds?Torchvision 规范化 - 它如何在手段/sds 的元组上运行?
【发布时间】:2025-12-01 11:30:01
【问题描述】:

我不明白这种转换是如何从 torchvision 进行的。最终我想构建一个自定义的规范化类,所以我需要先弄清楚它是如何工作的。

在文档中它这样描述初始化:

def __init__(self, mean, std, inplace=False):
        self.mean = mean
        self.std = std
        self.inplace = inplace

当我通常传递这些参数(不是自定义类)时,我将它们作为每个通道的列表或元组传递:

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 参数的单个值。

该类必须以某种方式遍历通道以允许实现这一点,但它如何做到这一点以及如何在自定义类中实现它?

基于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}

但这不起作用,因为它没有通过每个渠道。

【问题讨论】:

    标签: pytorch torchvision


    【解决方案1】:

    里面调用的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])

    【讨论】:

    • 哦,哇,这太令人困惑了,因为torch 有自己的函数类,通常以同样的方式称为F.normalize。谢谢
    • 是的,torchvisiontorch 都有自己的功能接口。