Download train.py from SteveaWong/synthetic-pattern-classifier: direct link, hf CLI and curl.
- Browser
- Download file 2.02 kB
-
https://huggingface.co/SteveaWong/synthetic-pattern-classifier/resolve/main/train.py
- Command line
-
hf download hf://SteveaWong/synthetic-pattern-classifier/train.py
-
curl -L -o train.py https://huggingface.co/SteveaWong/synthetic-pattern-classifier/resolve/main/train.py
2.02 kB
| 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") |