autoencoderkiranbackend1 / Autoencoder.py
kiran6969's picture
Initial Commit
cd698c9
import torch
print("PyTorch version:", torch.__version__)
print("CUDA available:", torch.cuda.is_available())
print("GPU name:", torch.cuda.get_device_name(0))
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from datasets import load_dataset
batch_size = 32
transform = transforms.Compose([
transforms.Resize((128, 128)),
transforms.ToTensor()
])
ds = load_dataset("saitsharipov/CelebA-HQ")
class CelebAHQDataset(torch.utils.data.Dataset):
def __init__(self, hf_dataset, transform=None):
self.dataset = hf_dataset
self.transform = transform
def __len__(self):
return len(self.dataset)
def __getitem__(self, idx):
img = self.dataset[idx]["image"] # Hugging Face provides PIL images
if self.transform:
img = self.transform(img)
return img, 0 # dummy label (autoencoder doesn’t need labels)
# Train/test split
train_data = CelebAHQDataset(ds["train"], transform=transform)
train_loader = DataLoader(train_data, batch_size=16, shuffle=True)
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Conv2d(3,32,3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(32,64,3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(64, 128, 3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(128, 256, 3, stride=2, padding=1)
)
self.decoder = nn.Sequential(
nn.ConvTranspose2d(256, 128, 3, stride=2, padding=1, output_padding=1), # 16x16
nn.ReLU(),
nn.ConvTranspose2d(128, 64, 3, stride=2, padding=1, output_padding=1), # 32x32
nn.ReLU(),
nn.ConvTranspose2d(64, 32, 3, stride=2, padding=1, output_padding=1), # 64x64
nn.ReLU(),
nn.ConvTranspose2d(32, 3, 3, stride=2, padding=1, output_padding=1), # 128x128
nn.Sigmoid()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
model = Autoencoder()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
criterion = nn.L1Loss()
optimizer = optim.Adam(model.parameters(), lr=1e-4)
num_epochs = 50
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for data in train_loader:
imgs, _ = data
imgs = imgs.to(device)
optimizer.zero_grad()
outputs = model(imgs)
loss = criterion(outputs, imgs)
loss.backward()
optimizer.step()
running_loss += loss.item() * imgs.size(0)
epoch_loss = running_loss / len(train_loader.dataset)
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item(): .4f}')
torch.save(model.state_dict(), "celeba_autoencoder.pth")
print("Model saved!")