【问题标题】:How can I crop away a tensor’s constant value padding (padding height and width are the same) with an unknown value and size?如何裁剪具有未知值和大小的张量的恒定值填充(填充高度和宽度相同)?
【发布时间】:2021-03-30 13:44:49
【问题描述】:

如何用未知的值和大小裁剪张量的恒定值填充(填充高度和宽度相同)?

我认为,因为我的张量周围的填充具有恒定值和相同的高度/宽度,所以应该可以知道在哪里裁剪张量以移除填充。

import torch

# Test tensor with NCHW dimensions
a = torch.randn(1,4,5,5) # Can have any H & W size

# Create padding for testing
b = torch.nn.functional.pad(a, (2,2,2,2), 'constant', value=1.2) # Value can be any number

c = # equal to a, without being able to use the variables a or b (or their argument values)

NumPy 解决方案是可以接受的,因为我可以轻松地将它们转换为 PyTorch。

编辑:

pad = torch.where(b[0, 0] - b[0, 0, 0, 0] != 0)[0][0]

x_pad, y_pad = 0, 0
if (b.size(3) % 2) == 0:
    x_pad = 1
if (b.size(2) % 2) == 0:
    y_pad = 1
c = b[:, :, pad : -(pad + y_pad), pad : -(pad + x_pad)]

assert c == a

【问题讨论】:

    标签: python numpy pytorch padding crop


    【解决方案1】:

    您可以通过获取特征图的中间行来了解特征图的内容,并通过查找第一个元素变化来测量填充:

    midrow = b[0, 0, b.shape[3]//2, :]
    pad = (midrow[:-1] == midrow[:1])[:midrow.shape[0]//2].sum()
    

    或者,您可以使用填充值减去其中一个特征图,并找到第一个非零值,即填充大小:

    pad = torch.where(b[0,0] - b[0,0,0,0] != 0)[0][0]
    

    有了填充,我们可以丢弃所有批次元素和所有通道的特征图周围的适量值:

    a = b[:, :, pad:-pad, pad:-pad]
    

    【讨论】:

    • 谢谢!解决方案 2 似乎对我来说效果最好,但我必须为原始未填充张量具有奇数维度的情况添加偏移量。
    • 例如:当a1, 3, 5, 5一起使用时,解决方案2:pad = torch.where(b[0,0] - b[0,0,0,0] != 0)[0][0]; b[:, :, pad:-pad, pad:-pad]返回a,不适合你?
    • 是的,它不完全是a,因为它可以在右侧和底部留下额外的一行。我用我所做的编辑添加了一个编辑。
    • 例如,当我测试一个输入大小为 torch.Size([1,3, 28, 28]) 时,它包含一个正方形的 torch.Size([1,3,5,5 ]),底部和右侧会多出一行常量。
    • 哦,我明白了,我不知道你有这个边缘案例。我虽然填充同样适用于两侧。
    猜你喜欢
    • 2022-01-20
    • 2020-06-30
    • 2012-07-19
    • 1970-01-01
    • 2016-09-28
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多