卷积-对偶数和奇数大小进行反卷积

问题描述

我要在网络中放置两个不同大小的张量。

C = nn.Conv1d(1,1,kernel_size=1,stride=2)
TC = nn.ConvTranspose1d(1,stride=2)

a = torch.rand(1,100)
b = torch.rand(1,101)

a_out,b_out = TC(C(a)),TC(C(b))

结果是

a_out = torch.size([1,99]) # What I want is [1,100]
b_out = torch.size([1,101])

有什么方法可以解决这个问题?
我需要你的帮助。
谢谢

解决方法

根据documentation,这是预期的行为。当检测到偶数输入长度与输入长度相同时,可以使用填充。

类似这样的东西

class PadEven(nn.Module):
    def __init__(self,conv,deconv,pad_value=0,padding=(0,1)):
        super().__init__()
        self.conv = conv
        self.deconv = deconv
        self.pad = nn.ConstantPad1d(padding=padding,value=pad_value)

    def forward(self,x):
        nd = x.size(-1)
        x = self.deconv(self.conv(x))
        if nd % 2 == 0:
            x = self.pad(x)
        return x


C = nn.Conv1d(1,1,kernel_size=1,stride=2)
TC = nn.ConvTranspose1d(1,stride=2)
P = PadEven(C,TC)

a = torch.rand(1,100)
b = torch.rand(1,101)

a_out,b_out = P(a),P(b)