Pytorch for Dummies 中的卷积自编码器

Ste*_*fan -1 machine-learning computer-vision neural-network deep-learning pytorch

我在这里问一些关于 Pytorch 和卷积自动编码器的更一般的问题。

  1. 如果我只使用卷积层 (FCN),我什至需要关心输入形状吗?然后我如何最好地选择特征图的数量?
  2. ConvTranspose2d 层会自动解除池化吗?
  3. 您能在我的示例中发现任何错误或非常规代码吗?

顺便说一句,我想制作一个对称的卷积自动编码器来对不同图像大小的黑白图像进行着色。

    self.encoder = nn.Sequential (
        # conv 1
        nn.Conv2d(in_channels=3, out_channels=512, kernel_size=3, stride=1, padding=1),
        nn.ReLU,
        nn.MaxPool2d(kernel_size=2, stride=2),  # 1/2
        nn.BatchNorm2d(512),

        # conv 2
        nn.Conv2d(in_channels=512, out_channels=256, kernel_size=3, stride=1, padding=1),
        nn.ReLU,
        nn.MaxPool2d(kernel_size=2, stride=2),  # 1/4
        nn.BatchNorm2d(256),

        # conv 3
        nn.Conv2d(in_channels=256, out_channels=128, kernel_size=3, stride=1, padding=1),
        nn.ReLU,
        nn.MaxPool2d(kernel_size=2, stride=2),  # 1/8
        nn.BatchNorm2d(128),

        # conv 4
        nn.Conv2d(in_channels=128, out_channels=64, kernel_size=3, stride=1, padding=1),
        nn.ReLU,
        nn.MaxPool2d(kernel_size=2, stride=2),  #1/16
        nn.BatchNorm2d(64)
    )


    self.encoder = nn.Sequential (
        # conv 5
        nn.ConvTranspose2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),
        nn.ReLU,
        nn.BatchNorm2d(128),

        # conv 6
        nn.ConvTranspose2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),
        nn.ReLU,
        nn.BatchNorm2d(256),

        # conv 7
        nn.ConvTranspose2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1),
        nn.ReLU,
        nn.BatchNorm2d(512),

        # conv 8
        nn.ConvTranspose2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
        nn.Softmax()
    )

    def forward(self, x):
        h = x
        h = self.encoder(h)
        h = self.decoder(h)
        return h
Run Code Online (Sandbox Code Playgroud)

Mac*_*dek 6

  1. 不,您不需要关心完全卷积模型的输入宽度和高度。但是应该确保编码器中的每个下采样操作都与解码器中的相应上采样操作相匹配。

  2. 我不确定你所说的解池是什么意思。如果您的意思是上采样(增加空间维度),那么这就是stride参数的用途。在 PyTorch 中,转置卷积stride=2将上采样两次。但是请注意,许多从业者更喜欢使用双线性上采样,然后是常规卷积,而不是转置卷积。是原因之一。

另一方面,如果您的意思是实际解池,那么您应该查看torch.MaxUnpool2d. 您需要从MaxPool2d操作中收集最大值索引并将它们输入MaxUnpool2d.

普遍的共识似乎是您应该在下采样时增加特征图的数量。您的代码似乎正好相反。2 的连续幂似乎是一个很好的起点。很难提出更好的经验法则。您可能需要进行一些实验。

在其他说明中,我不确定您为什么将 softmax 应用于编码器输出。