Download train.py from Rbcloud/country-flag-detection: direct link, hf CLI and curl.
- Browser
- Download file 3.09 kB
-
https://huggingface.co/Rbcloud/country-flag-detection/resolve/main/train.py
- Command line
-
hf download hf://Rbcloud/country-flag-detection/train.py
-
curl -L -o train.py https://huggingface.co/Rbcloud/country-flag-detection/resolve/main/train.py
3.09 kB
| import torch | |
| import torch.nn as nn | |
| import torch.nn.functional as F | |
| from torch.utils.data import DataLoader | |
| from torchvision import transforms, datasets, models | |
| from torchvision.utils import make_grid | |
| import os | |
| import time | |
| from PIL import ImageFile | |
| import math | |
| from model import ConvolutionalNet | |
| ImageFile.LOAD_TRUNCATED_IMAGES = True | |
| import numpy as np | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| train_transforms = transforms.Compose([ | |
| transforms.RandomRotation(10), | |
| transforms.RandomHorizontalFlip(), | |
| transforms.ToTensor(), | |
| transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) | |
| ]) | |
| test_transform = transforms.Compose([ | |
| transforms.ToTensor(), | |
| transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) | |
| ]) | |
| train_dataset = datasets.ImageFolder(root='./data/train', transform=train_transforms) | |
| test_dataset = datasets.ImageFolder(root='./data/test', transform=test_transform) | |
| torch.manual_seed(42) | |
| train_loader = DataLoader(train_dataset, batch_size=10, shuffle=True) | |
| test_loader = DataLoader(test_dataset, batch_size=10, shuffle=False) | |
| class_names = train_dataset.classes | |
| for images, labels in train_loader: | |
| break | |
| torch.manual_seed(101) | |
| model = ConvolutionalNet() | |
| criterion = nn.CrossEntropyLoss() | |
| optimizer = torch.optim.Adam(model.parameters(), lr=0.001) | |
| start_time = time.time() | |
| epochs = 5 | |
| # BATCH LIMITS | |
| max_trn_batch = 800 | |
| max_tst_batch = 300 | |
| train_losses = [] | |
| test_losses = [] | |
| train_correct = [] | |
| test_correct = [] | |
| for epoch in range(epochs): | |
| trn_corr = 0 | |
| tst_corr = 0 | |
| for b, (X_train, y_train) in enumerate(train_loader): | |
| # if b == max_trn_batch: | |
| # break | |
| y_pred = model(X_train) | |
| loss = criterion(y_pred, y_train) | |
| if b % 200 == 0: | |
| print(f"Epoch: {epoch+1}/{epochs}\tBatch: {b+1}\tLoss: {loss.item()}") | |
| predicted = torch.max(y_pred, 1)[1] | |
| batch_corr = (predicted == y_train).sum() | |
| trn_corr += batch_corr | |
| optimizer.zero_grad() | |
| loss.backward() | |
| optimizer.step() | |
| train_losses.append(loss) | |
| train_correct.append(trn_corr) | |
| # TEST | |
| with torch.no_grad(): | |
| for b, (X_test, y_test) in enumerate(test_loader): | |
| # if b == max_tst_batch: | |
| # break | |
| try: | |
| y_pred = model(X_test) | |
| except: | |
| print("Error testing images") | |
| continue | |
| loss = criterion(y_pred, y_test) | |
| predicted = torch.max(y_pred, 1)[1] | |
| batch_corr = (predicted == y_test).sum() | |
| tst_corr += batch_corr | |
| test_losses.append(loss) | |
| test_correct.append(tst_corr) | |
| end_time = time.time() | |
| total_time = end_time - start_time | |
| print(f"Time taken: minutes: {math.floor(total_time / 60)} seconds: {math.floor(total_time % 60)}") | |
| torch.save(model.state_dict(), 'model.pt') | |
| plt.plot([x.detach().numpy() for x in train_losses], label='train loss') | |
| plt.plot(test_losses, label='test loss') | |
| plt.legend() | |
| plt.plot() | |
| plt.plot([t/80 for t in train_correct], label='train accuracy') | |
| plt.plot([t/30 for t in test_correct], label='test accuracy') | |
| plt.legend() | |
| plt.plot() | |
| print(f'Accuracy: {100*test_correct[-1].item()/1000}') | |