【问题标题】:Bring any PyTorch cuda tensor in the range [0,1]将任何 PyTorch cuda 张量带入 [0,1] 范围内
【发布时间】:2020-05-24 08:52:38
【问题描述】:

假设我有一个形状为 [b,c,h,w] 的 PyTorch Cuda 浮点张量 x,采用浮点张量范围允许的任意值。我想在 [0,1] 范围内对其进行归一化。

我想到了以下算法(但任何其他算法也可以)。

步骤 1:在每个批次中找到最小值。称它为min,形状为[b,1,1,1]

Step2:同样找到最大值并将其命名为max

第三步:使用y = (x-min)/max。或者使用y = (x-min)/(max-min)。我不知道哪个会更好。 y 的形状应该与x 的形状相同。

我正在使用 PyTorch 1.3.1。

具体来说,我无法使用torch.min() 获得所需的minmax 也是如此。

我将使用它来将其馈送到预训练的 VGG 以计算感知损失(在上述归一化之后,我还会将它们带到 ImageNet 均值和标准差)。由于某种原因,我无法在数据加载部分执行 [0,1] 范围,因为我所在地区以前的工作有一个非常具体的归一化算法,必须使用,但有时不能确保 [0,1] 范围,但会在它附近的某个地方。这就是为什么在计算感知损失时我必须做这个明确的归一化作为预防措施。我知道所有开箱即用的感知损失实现假设数据在 [0,1] 或 [-1,1] 范围内,因此不要进行此转换。

非常感谢

【问题讨论】:

    标签: image-processing computer-vision pytorch


    【解决方案1】:

    不是最优雅的方式,但您可以使用 keepdim=True 并指定每个维度来做到这一点:

    channel_min = x.min(dim=1, keepdim=True)[0].min(dim=2,keepdim=True)[0].min(dim=3, keepdim=True)[0]
    channel_max = x.max(dim=1, keepdim=True)[0].max(dim=2,keepdim=True)[0].max(dim=3, keepdim=True)[0]
    

    【讨论】:

    • 谢谢你。我在 python 中尝试了它们,channel_minchannel_max 以它们应有的方式工作。但是我发现y = (x-min)/max 是错误的并且得到了不正确的结果,而y = (x-min)/(max-min) 是唯一的选择。无论如何谢谢你
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2019-06-01
    • 2020-07-09
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多