Pytorch Conv2d与ConvTranspose2d中的跨步
我正在努力学习CIFAR10上的自动编码器。我在下面的代码中使用sequential编写了代码,效果很好: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
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])