| import torch.optim as optim |
| import torch |
| import torch.nn as nn |
| import torch.nn.parallel |
| import torch.optim |
| import torch.utils.data |
| import torch.utils.data.distributed |
| import torchvision.transforms as transforms |
| import torchvision.models |
| from torch.autograd import Variable |
| from torch.utils.data import random_split |
| import os |
| import time |
| import numpy as np |
| import pandas as pd |
| import torch.nn.functional as F |
| from torch.utils.data import Dataset |
| from torch.utils.data import DataLoader |
| import matplotlib.pyplot as plt |
| from PIL import Image |
| import torchvision.datasets as dsets |
| import seaborn as sn |
|
|
|
|
|
|
|
|
| |
| modellr = 1e-4 |
| BATCH_SIZE = 64 |
| EPOCHS = 20 |
| DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu') |
| |
| best_accuracy = 0 |
| best_epoch = 0 |
|
|
| np.random.seed(42) |
| torch.manual_seed(42) |
|
|
|
|
| |
| mean, std = [0.4914, 0.4822, 0.4465], [0.247, 0.243, 0.261] |
| |
|
|
| transform_train = transforms.Compose([ |
| transforms.Resize((32, 32)), |
| transforms.RandomHorizontalFlip(), |
| transforms.RandomRotation(30), |
| |
| transforms.ColorJitter(brightness = 0.1, |
| contrast = 0.1, |
| saturation = 0.1), |
| transforms.RandomAdjustSharpness(sharpness_factor = 2, p = 0.1), |
| transforms.ToTensor(), |
| transforms.Normalize(mean, std), |
| transforms.RandomErasing() |
| ]) |
| transform_test = transforms.Compose([ |
| transforms.Resize((32, 32)), |
| transforms.ToTensor(), |
| transforms.Normalize(mean, std), |
| ]) |
|
|
| full_dataset = dsets.CIFAR10(root='./data', train=True, download=True, transform = transform_train) |
| test_dataset = dsets.CIFAR10(root='./data', train=False, download=True, transform = transform_test) |
|
|
| |
| train_size = int(0.9 * len(full_dataset)) |
| val_size = len(full_dataset) - train_size |
|
|
| torch.manual_seed(42) |
| train_dataset, validation_dataset = random_split(full_dataset, [train_size, val_size]) |
|
|
|
|
|
|
| train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True) |
| test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=BATCH_SIZE, shuffle=False) |
|
|
| val_loader = torch.utils.data.DataLoader(dataset=validation_dataset, batch_size=BATCH_SIZE, shuffle=False) |
|
|
|
|
|
|
|
|
|
|
| |
| criterion = nn.CrossEntropyLoss() |
| model = torchvision.models.resnet18(pretrained=True) |
| num_ftrs = model.fc.in_features |
| model.fc = nn.Linear(num_ftrs, 10) |
| model.to(DEVICE) |
|
|
| optimizer = optim.Adam(model.parameters(), lr=modellr) |
|
|
|
|
| |
| def adjust_learning_rate(optimizer, epoch): |
| """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" |
| modellrnew = modellr * (0.1 ** (epoch // 50)) |
| print("lr:", modellrnew) |
| for param_group in optimizer.param_groups: |
| param_group['lr'] = modellrnew |
|
|
|
|
| model = torch.load("666cifar_model_resnet18_lr0.0001.pth") |
|
|
|
|
|
|
|
|
|
|
|
|
| from sklearn.metrics import confusion_matrix |
| import seaborn as sn |
| import matplotlib.pyplot as plt |
|
|
| def get_predictions(model, device, data_loader): |
| model.eval() |
| model.to(device) |
| all_predictions = [] |
| all_targets = [] |
|
|
| with torch.no_grad(): |
| for data, target in data_loader: |
| data, target = data.to(device), target.to(device) |
| outputs = model(data) |
| _, predicted = torch.max(outputs.data, 1) |
| all_predictions.extend(predicted.cpu().numpy()) |
| all_targets.extend(target.cpu().numpy()) |
|
|
| return np.array(all_predictions), np.array(all_targets) |
|
|
| |
| predictions, targets = get_predictions(model, DEVICE, test_loader) |
|
|
| |
| conf_matrix = confusion_matrix(targets, predictions) |
|
|
| |
| plt.figure(figsize=(10, 8)) |
| sn.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=range(10), yticklabels=range(10)) |
| plt.xlabel('Predicted Label') |
| plt.ylabel('True Label') |
| plt.title('Confusion Matrix') |
| plt.show() |