File size: 3,245 Bytes
1773e4e 482778d 1773e4e 482778d |
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
import os
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import torchvision.datasets as datasets
from torch.utils.data import DataLoader
from torchvision import models
from tqdm import tqdm # β
Progress bar
# β
Define dataset paths
train_dir = "train"
test_dir = "dataset/test"
# β
Optimized Transformations (Smaller image size)
transform = transforms.Compose([
transforms.Resize((128, 128)), # Reduce size for faster training
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.5], [0.5])
])
# β
Load datasets
train_dataset = datasets.ImageFolder(root=train_dir, transform=transform)
test_dataset = datasets.ImageFolder(root=test_dir, transform=transform)
# β
Get class names
class_names = train_dataset.classes
print(f"Class Names: {class_names}")
# β
Save class names for later use in `app.py`
with open("class_names.txt", "w") as f:
for name in class_names:
f.write(name + "\n")
# β
Optimized DataLoaders (Smaller batch size)
batch_size = 16 # Reduce batch size for speed
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
# β
Use a Faster Model (MobileNetV2)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = models.mobilenet_v2(pretrained=True)
model.classifier[1] = nn.Linear(model.classifier[1].in_features, len(class_names))
model = model.to(device)
# β
Define Loss Function & Optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# β
Train the Model with Progress Bar
num_epochs = 3 # Reduce epochs for faster training
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
progress_bar = tqdm(train_loader, desc=f"Epoch {epoch+1}/{num_epochs}", leave=False)
for images, labels in progress_bar:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
progress_bar.set_postfix(loss=f"{running_loss/len(train_loader):.4f}")
print(f"β
Epoch [{epoch+1}/{num_epochs}] - Loss: {running_loss/len(train_loader):.4f}")
# β
Save the Trained Model
torch.save(model.state_dict(), "plant_disease_model.pth")
print("β
Model training complete and saved as plant_disease_model.pth")
# β
Generate and Save y_true.pth and y_pred.pth
print("π Running model on test dataset to save predictions...")
y_true = []
y_pred = []
model.eval()
with torch.no_grad():
for images, labels in tqdm(test_loader, desc="Evaluating"):
images, labels = images.to(device), labels.to(device)
outputs = model(images)
preds = torch.argmax(outputs, dim=1)
y_true.extend(labels.cpu().numpy()) # Move to CPU before saving
y_pred.extend(preds.cpu().numpy())
# β
Save the true labels and predictions
torch.save(y_true, "y_true.pth")
torch.save(y_pred, "y_pred.pth")
print("β
Test labels (y_true.pth) and predictions (y_pred.pth) saved successfully.")
|