import time import torch as tr import torchvision as tv import torchvision.transforms as transforms from model import model, loss_fn, optimizer def main(): batch_size = 128 epochs = 10 transform = transforms.Compose([ transforms.Resize((64, 64)), transforms.ToTensor()]) trn_dataset = tv.datasets.ImageFolder( root='data/tiny-imagenet-200/train', transform=transform) evl_dataset = tv.datasets.ImageFolder( root='data/tiny-imagenet-200/val', transform=transform) trn_loader = tr.utils.data.DataLoader( trn_dataset, batch_size=batch_size, shuffle=True, num_workers=8, pin_memory=True) evl_loader = tr.utils.data.DataLoader( evl_dataset, batch_size=batch_size, shuffle=False, num_workers=8, pin_memory=True) device = tr.device("cuda" if tr.cuda.is_available() else "cpu") model.to(device) print("Running on:", device) start_time = time.time() for epoch in range(1, epochs + 1): model.train() for images, labels in trn_loader: images = images.to(device) labels = labels.to(device) optimizer.zero_grad() output = model(images) loss = loss_fn(tr.log(tr.clamp(output, min=1e-9)), labels) loss.backward() optimizer.step() model.eval() correct = 0 total = 0 with tr.no_grad(): for images, labels in evl_loader: images = images.to(device) labels = labels.to(device) output = model(images) preds = tr.argmax(output, dim=1) correct += tr.sum(preds == labels).item() total += labels.size(0) accuracy = correct / total print(f"Epoch {epoch}/{epochs} - Loss: {loss.item():.4f} - Accuracy: {accuracy*100:.2f}%") end_time = time.time() print("Training finished") print(f"Final Loss: {loss.item():.4f}") print(f"Final Accuracy: {accuracy*100:.2f}%") print(f"Total Time: {end_time - start_time:.2f} seconds") if __name__ == "__main__": main()