如何裁剪具有未知值和大小的张量的常量值填充填充高度和宽度相同?

问题描述

如何裁剪一个未知值和大小的张量的常量值填充(填充高度和宽度相同)?

我认为,由于张量周围的填充具有恒定值,并且高度/宽度相同,因此应该可以知道在何处裁剪张量以移除填充。

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),'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]

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

解决方法

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

midrow = b[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]

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

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