【问题标题】:Problem with designing a Convolutional Autoencoder设计卷积自动编码器的问题
【发布时间】:2021-04-18 10:02:20
【问题描述】:

这是我的第一个问题,所以如果我错过了添加一些东西,请原谅。

我正在尝试在 Pytorch 1.7.0 中创建卷积自动编码器,但在设计模型以使输出大小等于输入大小时遇到​​了困难。我目前正在研究 MNIST 数据集,输入张量大小为 1128*28,目前,输出为 1*1*29*29...

有人可以帮我找出问题吗? *请注意,我会在之后整合学习内容。


class autoencoder(nn.Module):
    def __init__(self, hidden_node_count):
        super(autoencoder, self).__init__()

        self.conv1 = nn.Conv2d(1, 32, 5, stride=2, padding=2)
        self.conv2 = nn.Conv2d(32,32, 5, stride=2)#, padding=2)
        self.pool = nn.MaxPool2d(hidden_node_count, hidden_node_count)
        self.t_conv1 = nn.ConvTranspose2d(32, 32, 5, stride=2)#, padding=2)
        self.t_conv2 = nn.ConvTranspose2d(32,  32, 5, stride=2)#, padding=2)
        self.t_conv3 = nn.ConvTranspose2d(32,  1, 5, stride=2)#, padding=2)

        self.relu = nn.ReLU(True)
        self.tanh = nn.Tanh()


    def forward(self, x):
        print(x.size(), "input")
        x = self.conv1(x)
        x = self.relu(x)
        print(x.size(), "conv1")

        x = self.conv2(x)
        print(x.size(), "conv2")

        x = self.pool(x)
        print(x.size(), "pool")

        x = self.t_conv1(x)
        x = self.relu(x)
        print(x.size(), "deconv1")

        x = self.t_conv2(x)
        x = self.relu(x)
        print(x.size(), "deconv2")
        x = self.t_conv3(x)

        x = self.tanh(x)
        print(x.size(), "deconv3")
        return x

其 STDOUT 为 ->


torch.Size([1, 1, 28, 28]) input
torch.Size([1, 32, 14, 14]) conv1
torch.Size([1, 32, 5, 5]) conv2
torch.Size([1, 32, 1, 1]) pool
torch.Size([1, 32, 5, 5]) deconv1
torch.Size([1, 32, 13, 13]) deconv2
torch.Size([1, 1, 29, 29]) deconv3
torch.Size([1, 1, 29, 29])
torch.Size([1, 1, 28, 28])

【问题讨论】:

    标签: python-3.x pytorch autoencoder mnist


    【解决方案1】:

    根据 ConvTranspose2d 的 documentation,这里是计算输出大小的公式:

    Hout​=(Hin​−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1
    

    在您的情况下,Hin=13padding=0dilation=1kernel_size=5output_padding=0,即为Hout=29。你的输出张量应该是这样的!

    如果您希望输出为 28,请添加一些填充。使用padding=1,您将获得大小为(1,32,27,27) 的输出,因为ConvTranpose2d 的输出大小不明确(阅读文档)。因此,您还需要添加一些输出填充:

    conv = nn.ConvTranspose2d(32, 1, 5, stride= 2, padding=1, output_padding=1)
    conv(randn(1,32,13,13)).size()
    >>> (1, 1, 28, 28)
    

    【讨论】:

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