File size: 1,478 Bytes
47b21c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 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}")