import torch
import torch.nn as nn
class ConvAutoencoder(nn.Module):
def __init__(self):
super().__init__()
# Encoder
self.encoder = nn.Sequential(
nn.Conv2d(1, 16, 3, stride=2, padding=1), # [B, 1, 28, 28] -> [B, 16, 14, 14]
nn.ReLU(),
nn.Conv2d(16, 32, 3, stride=2, padding=1), # [B, 16, 14, 14] -> [B, 32, 7, 7]
nn.ReLU(),
nn.Conv2d(32, 64, 7) # [B, 32, 7, 7] -> [B, 64, 1, 1]
)
# Decoder
self.decoder = nn.Sequential(
nn.ConvTranspose2d(64, 32, 7), # [B, 64, 1, 1] -> [B, 32, 7, 7]
nn.ReLU(),
nn.ConvTranspose2d(32, 16, 3, stride=2, padding=1, output_padding=1),
nn.ReLU(),
nn.ConvTranspose2d(16, 1, 3, stride=2, padding=1, output_padding=1),
nn.Sigmoid()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x