【问题标题】:Convolutional Autoencoder in Pytorch for DummiesPytorch for Dummies 中的卷积自动编码器
【发布时间】:2019-12-10 22:52:59
【问题描述】:

我来这里是想问一些关于 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

【问题讨论】:

  • 这段代码的一个问题是批范数层遵循一个开启了偏差的卷积。您应该在批量规范之前的卷积中设置bias=False。

标签: machine-learning neural-network deep-learning computer-vision pytorch


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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 2018-11-12
    • 1970-01-01
    • 2019-12-01
    • 2017-11-11
    • 1970-01-01
    • 2020-06-11
    • 2019-11-09
    • 2018-07-14
    相关资源
    最近更新 更多