我正在使用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"
问题是,在网络的输出上出现了一种网格,如下面的示例所示:
我试图改变激活功能,但没有任何变化。我能怎么办?
1条答案
按热度按时间eeq64g8w1#
我注意到有两件事可能会导致像这样的网格化:最后的
TransConv
层参数为5,2,并且始终使用hardTanh
。当我在自动编码器中使用sigmoid时,我看到了网格。最后一层确实应该有这样一个函数,将其规范化为输入图像的形式,但在这之间,其他层可能应该使用类似relu()
的东西。顺便说一下,这些参数在你的conv/deconv层中并不典型。通常,您希望保留大小,因此对于内核大小为5且步幅为1的
Conv2d
层,使用填充2,依此类推。对于ConvTranspose2d
,通常将sz 2和stride 2作为内核,以使每个空间dim 2精确地加倍。使用常规值。