Pytorch卷积自动编码器



卷积自动编码器的一个构造解码器如何?假设我有这个

(input -> conv2d -> maxpool2d -> maxunpool2d -> convTranspose2d -> output)

# CIFAR images shape = 3 x 32 x 32
class ConvDAE(nn.Module):
    def __init__(self):
        super().__init__()
        # input: batch x 3 x 32 x 32 -> output: batch x 16 x 16 x 16
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 16, 3, stride=1, padding=1), # batch x 16 x 32 x 32
            nn.ReLU(),
            nn.BatchNorm2d(16),
            nn.MaxPool2d(2, stride=2) # batch x 16 x 16 x 16
        )
        # input: batch x 16 x 16 x 16 -> output: batch x 3 x 32 x 32
        self.decoder = nn.Sequential(
            # this line does not work
            # nn.MaxUnpool2d(2, stride=2, padding=0), # batch x 16 x 32 x 32
            nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1, output_padding=1), # batch x 16 x 32 x 32
            nn.ReLU(),
            nn.BatchNorm2d(16),
            nn.ConvTranspose2d(16, 3, 3, stride=1, padding=1, output_padding=0), # batch x 3 x 32 x 32
            nn.ReLU()
        )
    def forward(self, x):
        print(x.size())
        out = self.encoder(x)
        print(out.size())
        out = self.decoder(out)
        print(out.size())
        return out

pytorch特定问题:为什么我不能在解码器部分中使用maxunpool2d。这给了我以下错误:

TypeError: forward() missing 1 required positional argument: 'indices'

和概念问题:我们不应该在解码器中进行倒数,而不是我们在编码器中所做的一切?我看到了一些实现,看来他们只关心解码器的输入和输出的尺寸。这里和这里有一些示例。

对于问题的火炬部分,UndOl模块作为所需的位置参数,从池化模块中返回的索引将以return_indices=True返回。所以你可以做

class ConvDAE(nn.Module):
    def __init__(self):
        super().__init__()
        # input: batch x 3 x 32 x 32 -> output: batch x 16 x 16 x 16
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 16, 3, stride=1, padding=1), # batch x 16 x 32 x 32
            nn.ReLU(),
            nn.BatchNorm2d(16),
            nn.MaxPool2d(2, stride=2, return_indices=True)
        )
        self.unpool = nn.MaxUnpool2d(2, stride=2, padding=0)
        self.decoder = nn.Sequential( 
            nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1, output_padding=1), 
            nn.ReLU(),
            nn.BatchNorm2d(16),
            nn.ConvTranspose2d(16, 3, 3, stride=1, padding=1, output_padding=0), 
            nn.ReLU()
        )
    def forward(self, x):
        print(x.size())
        out, indices = self.encoder(x)
        out = self.unpool(out, indices)
        out = self.decoder(out)
        print(out.size())
        return out

至于问题的一般部分,我认为最新的状态不是使用对称解码器部分,因为已经表明,Devonvolution/transped卷积会产生棋盘板效应,许多方法倾向于使用UPSMPLING模块反而。您将通过Pytorch频道更快地找到更多信息。

相关内容

  • 没有找到相关文章

最新更新