Pytorch Conv2d与ConvTranspose2d中的跨步

Pytorch Conv2d与ConvTranspose2d中的跨步,pytorch,sequential,stride,Pytorch,Sequential,Stride,我正在努力学习CIFAR10上的自动编码器。我在下面的代码中使用sequential编写了代码,效果很好: class Autoencoder(nn.Module): def __init__(self): super(Autoencoder, self).__init__() self.Flatten = Flatten() # Input size: [batch, 3, 32, 32] # Output size: [batch, 3, 32, 3

我正在努力学习CIFAR10上的自动编码器。我在下面的代码中使用sequential编写了代码,效果很好:

class Autoencoder(nn.Module):
def __init__(self):
    super(Autoencoder, self).__init__()
    self.Flatten = Flatten()
    
    # Input size: [batch, 3, 32, 32]
    # Output size: [batch, 3, 32, 32]
    self.encoder = nn.Sequential(
        nn.Conv2d(3, 12, 4, stride=2, padding=1),            # [batch, 12, 16, 16]
        nn.ReLU(),
        nn.Conv2d(12, 24, 4, stride=2, padding=1),           # [batch, 24, 8, 8]
        nn.ReLU(),
        nn.Conv2d(24, 48, 4, stride=2, padding=1),           # [batch, 48, 4, 4]
        ReLU(),
       
        
        
    )
    self.decoder = nn.Sequential(
        
        
        nn.ConvTranspose2d(48, 24, 4, stride=2, padding=1),  # [batch, 24, 8, 8]
        nn.ReLU(),
        nn.ConvTranspose2d(24, 12, 4, stride=2, padding=1),  # [batch, 12, 16, 16]
        nn.ReLU(),
        nn.ConvTranspose2d(12, 3, 4, stride=2, padding=1),   # [batch, 3, 32, 32]
        nn.Sigmoid(),
    )

def forward(self, x):
    encoded = self.encoder(x)
    
    decoded = self.decoder(encoded)
    return encoded, decoded
我决定添加一个线性层以减少输出维度。为此,我重写了上面的代码,如下所示(这次我避免使用sequential):

但是我得到了一个错误,当我打印每一层的输出时,我看到解码器没有构造与编码器输出相同的形状。我很困惑,为什么我没有得到与第一个用顺序编写的模型相同的结果。是不是因为转置层中的stride=2的工作方式不同?但为什么不按顺序写呢。 以下是打印解码器层形状的结果:

conv1 output torch.Size([100, 12, 16, 16])
conv2 output torch.Size([100, 24, 8, 8])
conv3 output torch.Size([100, 48, 4, 4])
code after view torch.Size([100, 768])
code after linear1 torch.Size([100, 10])
code after linear2 torch.Size([100, 768])
code after view torch.Size([100, 48, 4, 4])
deconv3 output torch.Size([100, 24, 7, 7])
deconv2 output torch.Size([100, 12, 13, 13])
deconv1 output torch.Size([100, 3, 25, 25])

您将内核大小从4更改为3。要使用内核大小3,您必须更改填充,即不能使用内核大小为4时使用的填充。您将内核大小从4更改为3。要使用内核大小3,必须更改填充,即不能使用与内核大小4时相同的填充。
conv1 output torch.Size([100, 12, 16, 16])
conv2 output torch.Size([100, 24, 8, 8])
conv3 output torch.Size([100, 48, 4, 4])
code after view torch.Size([100, 768])
code after linear1 torch.Size([100, 10])
code after linear2 torch.Size([100, 768])
code after view torch.Size([100, 48, 4, 4])
deconv3 output torch.Size([100, 24, 7, 7])
deconv2 output torch.Size([100, 12, 13, 13])
deconv1 output torch.Size([100, 3, 25, 25])