【问题标题】:Pytorch Conv1D gives different size to ConvTranspose1dPytorch Conv1D 为 ConvTranspose1d 提供不同的大小
【发布时间】:2021-12-23 04:49:07
【问题描述】:

我正在尝试为 pytorch/pytorch-lightning 中的一维时间序列数据构建一个基本/浅层 CNN 自动编码器。

目前,我的编码块是:

class encodingBlock(nn.Module):
    def __init__(self):
        super().__init__()
                
        self.conv1d_1 = nn.Conv1d(1, 64, kernel_size=32)
        self.relu = nn.ReLU()
        self.batchnorm = nn.BatchNorm1d(64)
        self.maxpool = nn.MaxPool1d(kernel_size=2, stride=2, return_indices=True)
        self.fc = nn.Linear(64, 4)

    def forward(self, x):
        cnn_out1 = self.conv1d_1(x)
        norm_out1 = self.batchnorm(cnn_out1)
        relu_out1 = self.relu(norm_out1)
        maxpool_out, indices = self.maxpool(relu_out1)
        gap_out = torch.mean(maxpool_out, dim = 2)
        fc_out = self.relu(self.fc(gap_out))
        return fc_out, indices

我的解码块是:

class decodingBlock(nn.Module):
    def __init__(self):
        super().__init__()
                
        self.Tconv1d_1 = nn.ConvTranspose1d(64, 1, kernel_size=32, output_padding=1)
        self.relu = nn.ReLU()
        self.batchnorm = nn.BatchNorm1d(1)
        self.maxunpool = nn.MaxUnpool1d(kernel_size=2, stride=2)
        self.upsamp = nn.Upsample(size=59, mode='nearest')
        self.fc = nn.Linear(4, 64)

    def forward(self, x, indices):
        fc_out = self.fc(x)
        relu_out = self.relu(fc_out)
        relu_out = relu_out.unsqueeze(dim = 2)
        upsamp_out = self.upsamp(relu_out)
        maxpool_out = self.maxunpool(upsamp_out, indices)
        cnnT_out = self.Tconv1d_1(maxpool_out)
        norm_out = self.batchnorm(cnnT_out)
        relu_out = self.relu(norm_out)            
        return relu_out

但是,看看输出:

Input size: torch.Size([1, 1, 150])
Conv1D out size: torch.Size([1, 64, 119])
Maxpool out size: torch.Size([1, 64, 59])
Global average pooling out size: torch.Size([1, 64])
Encoder dense out size: torch.Size([1, 4])
...
Decoder input: torch.Size([1, 4])
Decoder dense out size: torch.Size([1, 64])
Unsqueeze out size: torch.Size([1, 64, 1])
Upsample out size: torch.Size([1, 64, 59])
Decoder maxunpool out size: torch.Size([1, 64, 118])
Transpose Conv out size: torch.Size([1, 1, 149])

MaxUnpool1d 和 ConvTranspose1d 层的输出不是预期的维度。

我有两个问题希望得到帮助:

  1. 为什么尺寸有误?
  2. 有没有比我使用的上采样过程更好的方法来“反转”全局平均池化?

【问题讨论】:

    标签: python pytorch conv-neural-network pytorch-lightning


    【解决方案1】:

    1.关于输入和输出形状:
    的文档有关于输入和输出大小的明确公式。 对于convolution:

    pooling 也一样:

    对于transposed convolution:

    对于unpooling:

    确保您的内边距和output_padding 值相加成正确的输出形状。

    2。有没有更好的方法?
    正如您已经注意到的,转置卷积有其缺陷。它也倾向于产生"checkerboard artifacts"。

    一种解决方案是使用pixelshuffle:即为每个低分辨率点预测两倍的通道数,然后将它们分成具有所需特征数量的两个点。

    或者,您可以interpolate 使用从低分辨率到较高分辨率的固定方法。对上采样向量应用常规卷积。 如果您选择此路径,您可能会考虑使用 ResizeRight 而不是 pytorch 的插值 - 它可以更好地处理边缘情况。

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 2021-02-12
      • 2021-06-05
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多