PyTorch中自动编码器的输出在图像上显示网格

50pmv0ei  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(138)

我正在使用PyTorch中实现的卷积自动编码器进行图像重建任务。我使用的模型如下:

class Model_CAE(nn.Module):
    def __init__(self):
        super(Model_CAE, self).__init__()
        self.act = nn.Hardtanh()
    
        # ENCODER
        self.e1 = nn.Conv2d(3, 16, kernel_size=5, stride=2, padding=0)
        self.e2 = nn.Conv2d(16, 32, kernel_size=2, stride=2, padding=2)
        self.e3 = nn.Conv2d(32, 64, kernel_size=2, stride=2, padding=0)

        # DECODER
        self.d1 = nn.ConvTranspose2d(64, 32, kernel_size=2, stride=2, padding=0, output_padding=0)
        self.d2 = nn.ConvTranspose2d(32, 16, kernel_size=2, stride=2, padding=2, output_padding=0)
        self.d3 = nn.ConvTranspose2d(16, 3, kernel_size=5, stride=2, padding=0, output_padding=1)

    def forward(self, x):
        #SENZA LINEAR
        e1 = self.act(self.e1(x))
        e2 = self.act(self.e2(e1))
        e3 = self.act(self.e3(e2))
   
        d1 = self.act(self.d1(e3))
        d2 = self.act(self.d2(d1))
        out = self.act(self.d3(d2))
    
        return out

    def name(self):
        return "CAE"

问题是,在网络的输出上出现了一种网格,如下面的示例所示:

我试图改变激活功能,但没有任何变化。我能怎么办?

eeq64g8w

eeq64g8w1#

我注意到有两件事可能会导致像这样的网格化:最后的TransConv层参数为5,2,并且始终使用hardTanh。当我在自动编码器中使用sigmoid时,我看到了网格。最后一层确实应该有这样一个函数,将其规范化为输入图像的形式,但在这之间,其他层可能应该使用类似relu()的东西。
顺便说一下,这些参数在你的conv/deconv层中并不典型。通常,您希望保留大小,因此对于内核大小为5且步幅为1的Conv2d层,使用填充2,依此类推。对于ConvTranspose2d,通常将sz 2和stride 2作为内核,以使每个空间dim 2精确地加倍。使用常规值。

相关问题