Spaces:
Sleeping
Sleeping
| # Image transformations (VERY IMPORTANT for ResNet) | |
| transform = transforms.Compose([ | |
| transforms.Resize((224, 224)), # ResNet needs this | |
| transforms.ToTensor() | |
| ]) | |
| # Load dataset | |
| dataset = datasets.ImageFolder( | |
| root='/content/drive/MyDrive/TrashNet', | |
| transform=transform | |
| ) | |
| # Create DataLoader | |
| train_loader = torch.utils.data.DataLoader( | |
| dataset, | |
| batch_size=32, | |
| shuffle=True | |
| ) | |
| # Number of classes | |
| NUM_CLASSES = len(dataset.classes) | |
| print("Classes:", dataset.classes) | |
| # Load pretrained ResNet | |
| model = models.resnet18(pretrained=True) | |
| # Freeze all layers (optional but recommended) | |
| for param in model.parameters(): | |
| param.requires_grad = False | |
| # Replace final layer | |
| model.fc = nn.Linear(model.fc.in_features, NUM_CLASSES) | |
| # Move to device | |
| model = model.to(device) | |
| print(model) | |
| criterion = nn.CrossEntropyLoss() | |
| # Only train last layer | |
| optimizer = optim.Adam(model.fc.parameters(), lr=0.001) | |
| EPOCHS = 5 | |
| for epoch in range(EPOCHS): | |
| model.train() | |
| running_loss = 0.0 | |
| for images, labels in train_loader: | |
| images, labels = images.to(device), labels.to(device) | |
| # Forward pass | |
| outputs = model(images) | |
| loss = criterion(outputs, labels) | |
| # Backward | |
| optimizer.zero_grad() | |
| loss.backward() | |
| optimizer.step() | |
| running_loss += loss.item() | |
| print(f"Epoch [{epoch+1}/{EPOCHS}], Loss: {running_loss:.4f}") |