| 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 |
|
|
| |
| device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") |
|
|
| |
| data_transforms = transforms.Compose([ |
| transforms.Resize(32), |
| transforms.ToTensor(), |
| transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) |
| ]) |
|
|
| |
| dataset = ImageFolder(root="./synthetic_dataset", transform=data_transforms) |
|
|
| |
| batch_size = 32 |
| data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True) |
|
|
| |
| 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) |
|
|
| |
| criterion = nn.CrossEntropyLoss() |
| optimizer = optim.Adam(model.parameters(), lr=1e-3) |
|
|
| |
| 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}") |
|
|
| |
| torch.save(model.state_dict(), "best_model.pt") |
| print("Training complete. Model saved to best_model.pt") |