Свертка — деконволюция для четного и нечетного размера

#pytorch #convolution #deconvolution

#pytorch #свертка #деконволюция

Вопрос:

У меня есть два разных тензора размера для подключения к сети.

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

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

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

Результаты таковы

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

Есть ли какой-либо способ справиться с этой проблемой?
Мне нужна ваша помощь.
Спасибо

Ответ №1:

Это ожидаемое поведение в соответствии с документацией. Может быть, заполнение может использоваться при обнаружении четной длины ввода, чтобы получить ту же длину, что и ввод.

Что-то вроде этого

 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, 1, kernel_size=1, stride=2)
P = PadEven(C, TC)

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

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