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!")