【问题标题】:transforms.Normalize() between 0 and 1 when using Lab使用 Lab 时,transforms.Normalize() 介于 0 和 1 之间
【发布时间】:2019-11-30 11:51:53
【问题描述】:

这意味着,当我想将张量标准化为 0 到 1 的范围时,我应该使用 std 吗?但我只使用 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: 张量 a (2) 的大小必须与张量 b 的大小相匹配 (3) 在非单维0

【问题讨论】:

    标签: python tensorflow machine-learning deep-learning pytorch


    【解决方案1】:

    如您所见,PyTorch 抱怨张量大小,因为您缺少通道。

    此外,“通常”的均值和标准值是在 ImageNet 数据集上计算得出的,如果您的数据的统计信息与该数据集的统计信息相匹配,这些值将非常有用。

    由于您只使用两个通道,我假设您的域可能与 3 通道自然图像有很大不同。在这种情况下,我将简单地将0.5 用于meanstd,这样最小值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() assumes your input to lie in range [0, 255] 在转换之前,所以它基本上将它除以 255。如果您的域中不是这种情况(例如,由于某种原因,您的输入总是在 [1, 50] 范围内)我会简单创建一个custom transform 来划分数据的实际上限。

    【讨论】:

    • 我以前也这样做过,但是范围是-1到1,对吧?我真的需要它是 0 到 1
    • 不客气 - 我还添加了一些最后的信息,也许你会觉得它们很有趣
    • 哦,我使用 Lab 色彩空间。因此,值范围是 -128 到 127。如果您能为此案例提供代码库,我将非常感激,因为老实说,我并没有受到太大的挑战。
    • 要标准化张量的范围,您只需减去最小值并乘以新范围,例如x_norm = (x - min_range ) / (max_range - min_range)。见stats.stackexchange.com/questions/70801/…
    猜你喜欢
    • 2012-04-10
    • 2015-02-20
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2018-07-24
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多