import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader import torchvision import torchvision.transforms as transforms from torchvision.datasets import ImageFolder import os # Set device (GPU if available, otherwise CPU) device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Define data transforms data_transforms = transforms.Compose([ transforms.Resize(32), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # Load dataset dataset = ImageFolder(root="./synthetic_dataset", transform=data_transforms) # Create data loader batch_size = 32 data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True) # Define CNN model class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.fc1 = nn.Linear(6 * 14 * 14, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 3) def forward(self, x): x = self.pool(torch.relu(self.conv1(x))) x = x.view(-1, 6 * 14 * 14) x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return x model = CNN().to(device) # Define loss function and optimizer criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) # Train model for epoch in range(5): running_loss = 0.0 for i, data in enumerate(data_loader): inputs, labels = data inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() avg_loss = running_loss / (i + 1) print(f"Epoch {epoch+1}/5 — Loss: {avg_loss:.4f}") # Save model weights torch.save(model.state_dict(), "best_model.pt") print("Training complete. Model saved to best_model.pt")