import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader import torchvision.transforms as transforms from torchvision.datasets import ImageFolder # Define the autoencoder architecture class Autoencoder(nn.Module): def __init__(self): super(Autoencoder, self).__init__() # Encoder layers self.encoder = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1), # 3x256x256 -> 16x128x128 nn.LeakyReLU(inplace=True), nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1), # 16x128x128 -> 32x64x64 nn.LeakyReLU(inplace=True), nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1), # 32x64x64 -> 64x32x32 nn.LeakyReLU(inplace=True) ) # Decoder layers self.decoder = nn.Sequential( nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1), # 64x32x32 -> 32x64x64 nn.LeakyReLU(inplace=True), nn.ConvTranspose2d(32, 16, kernel_size=3, stride=2, padding=1, output_padding=1), # 32x64x64 -> 16x128x128 nn.LeakyReLU(inplace=True), nn.ConvTranspose2d(16, 3, kernel_size=3, stride=2, padding=1, output_padding=1), # 16x128x128 -> 3x256x256 nn.Tanh() ) def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x