mirror of
https://github.com/aladdinpersson/Machine-Learning-Collection.git
synced 2026-02-21 11:18:01 +00:00
Initial commit
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
2
ML/Projects/Exploring_MNIST/utils/import_utils.py
Normal file
2
ML/Projects/Exploring_MNIST/utils/import_utils.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from utils.mnist_data import mnist_data
|
||||
from utils.utils import check_accuracy, save_checkpoint, visdom_plotting, load_model
|
||||
94
ML/Projects/Exploring_MNIST/utils/mnist_data.py
Normal file
94
ML/Projects/Exploring_MNIST/utils/mnist_data.py
Normal file
@@ -0,0 +1,94 @@
|
||||
import numpy as np
|
||||
import torchvision.datasets as datasets
|
||||
from torch.utils.data import DataLoader, SubsetRandomSampler
|
||||
|
||||
|
||||
class mnist_data(object):
|
||||
def __init__(
|
||||
self,
|
||||
shuffle,
|
||||
transform_train,
|
||||
transform_test,
|
||||
num_workers=0,
|
||||
create_validation_set=True,
|
||||
batch_size=128,
|
||||
validation_size=0.2,
|
||||
random_seed=1,
|
||||
):
|
||||
self.shuffle = shuffle
|
||||
self.validation_size = validation_size
|
||||
self.transform_train = transform_train
|
||||
self.transform_test = transform_test
|
||||
self.random_seed = random_seed
|
||||
self.create_validation_set = create_validation_set
|
||||
self.batch_size = batch_size
|
||||
self.num_workers = num_workers
|
||||
|
||||
def download_data(self):
|
||||
mnist_trainset = datasets.MNIST(
|
||||
root="./data", train=True, download=True, transform=self.transform_train
|
||||
)
|
||||
mnist_testset = datasets.MNIST(
|
||||
root="./data", train=False, download=True, transform=self.transform_test
|
||||
)
|
||||
|
||||
return mnist_trainset, mnist_testset
|
||||
|
||||
def create_validationset(self, mnist_trainset):
|
||||
num_train = len(mnist_trainset)
|
||||
indices = list(range(num_train))
|
||||
split = int(self.validation_size * num_train)
|
||||
|
||||
if self.shuffle:
|
||||
np.random.seed(self.random_seed)
|
||||
np.random.shuffle(indices)
|
||||
|
||||
train_idx, valid_idx = indices[split:], indices[:split]
|
||||
|
||||
train_sampler = SubsetRandomSampler(train_idx)
|
||||
validation_sampler = SubsetRandomSampler(valid_idx)
|
||||
|
||||
loader_train = DataLoader(
|
||||
dataset=mnist_trainset,
|
||||
batch_size=self.batch_size,
|
||||
sampler=train_sampler,
|
||||
num_workers=self.num_workers,
|
||||
)
|
||||
loader_validation = DataLoader(
|
||||
dataset=mnist_trainset,
|
||||
batch_size=self.batch_size,
|
||||
sampler=validation_sampler,
|
||||
num_workers=self.num_workers,
|
||||
)
|
||||
|
||||
return loader_train, loader_validation
|
||||
|
||||
def main(self):
|
||||
mnist_trainset, mnist_testset = self.download_data()
|
||||
|
||||
if self.create_validation_set:
|
||||
loader_train, loader_validation = self.create_validationset(mnist_trainset)
|
||||
loader_test = DataLoader(
|
||||
dataset=mnist_testset,
|
||||
batch_size=self.batch_size,
|
||||
shuffle=False,
|
||||
num_workers=self.num_workers,
|
||||
)
|
||||
|
||||
return loader_train, loader_validation, loader_test
|
||||
|
||||
else:
|
||||
loader_train = DataLoader(
|
||||
dataset=mnist_trainset,
|
||||
batch_size=self.batch_size,
|
||||
shuffle=self.shuffle,
|
||||
num_workers=self.num_workers,
|
||||
)
|
||||
loader_test = DataLoader(
|
||||
dataset=mnist_testset,
|
||||
batch_size=self.batch_size,
|
||||
shuffle=False,
|
||||
num_workers=self.num_workers,
|
||||
)
|
||||
|
||||
return loader_train, loader_test
|
||||
130
ML/Projects/Exploring_MNIST/utils/utils.py
Normal file
130
ML/Projects/Exploring_MNIST/utils/utils.py
Normal file
@@ -0,0 +1,130 @@
|
||||
import torch
|
||||
import visdom
|
||||
import os
|
||||
|
||||
device = "cuda" if torch.cuda.is_available() else "cpu"
|
||||
dtype = torch.float32
|
||||
|
||||
|
||||
def save_checkpoint(filename, model, optimizer, train_acc, epoch):
|
||||
save_state = {
|
||||
"state_dict": model.state_dict(),
|
||||
"acc": train_acc,
|
||||
"epoch": epoch + 1,
|
||||
"optimizer": optimizer.state_dict(),
|
||||
}
|
||||
print()
|
||||
print("Saving current parameters")
|
||||
print("___________________________________________________________")
|
||||
|
||||
torch.save(save_state, filename)
|
||||
|
||||
|
||||
def check_accuracy(loader, model):
|
||||
if loader.dataset.train:
|
||||
print("Checking accuracy on training or validation set")
|
||||
else:
|
||||
print("Checking accuracy on test set")
|
||||
num_correct = 0
|
||||
num_samples = 0
|
||||
# model.eval() # set model to evaluation mode
|
||||
with torch.no_grad():
|
||||
for x, y in loader:
|
||||
x = x.to(device=device, dtype=dtype) # move to device, e.g. GPU
|
||||
y = y.to(device=device, dtype=torch.long)
|
||||
scores = model(x)
|
||||
_, preds = scores.max(1)
|
||||
num_correct += (preds == y).sum()
|
||||
num_samples += preds.size(0)
|
||||
acc = (float(num_correct) / num_samples) * 100.0
|
||||
print("Got %d / %d correct (%.2f)" % (num_correct, num_samples, acc))
|
||||
return acc
|
||||
|
||||
|
||||
def load_model(args, model, optimizer):
|
||||
if args.resume:
|
||||
model.eval()
|
||||
if os.path.isfile(args.resume):
|
||||
print("=> loading checkpoint '{}'".format(args.resume))
|
||||
checkpoint = torch.load(args.resume)
|
||||
start_epoch = checkpoint["epoch"]
|
||||
best_acc = checkpoint["acc"]
|
||||
model.load_state_dict(checkpoint["state_dict"])
|
||||
optimizer.load_state_dict(checkpoint["optimizer"])
|
||||
print(
|
||||
"=> loaded checkpoint '{}' (epoch {})".format(
|
||||
args.resume, checkpoint["epoch"]
|
||||
)
|
||||
)
|
||||
return model, optimizer, checkpoint, start_epoch, best_acc
|
||||
else:
|
||||
print("=> no checkpoint found at '{}'".format(args.resume))
|
||||
else:
|
||||
print("No pretrained model. Starting from scratch!")
|
||||
|
||||
|
||||
class visdom_plotting(object):
|
||||
def __init__(self):
|
||||
self.viz = visdom.Visdom()
|
||||
|
||||
self.cur_batch_win = None
|
||||
self.cur_batch_win_opts = {
|
||||
"title": "Epoch Loss Trace",
|
||||
"xlabel": "Batch Number",
|
||||
"ylabel": "Loss",
|
||||
"width": 600,
|
||||
"height": 400,
|
||||
}
|
||||
|
||||
self.cur_validation_acc = None
|
||||
self.cur_validation_acc_opts = {
|
||||
"title": "Validation accuracy",
|
||||
"xlabel": "Epochs",
|
||||
"ylabel": "Validation Accuracy",
|
||||
"width": 600,
|
||||
"height": 400,
|
||||
}
|
||||
|
||||
self.cur_training_acc = None
|
||||
self.cur_training_acc_opts = {
|
||||
"title": "Training accuracy",
|
||||
"xlabel": "Epochs",
|
||||
"ylabel": "Train Accuracy",
|
||||
"width": 600,
|
||||
"height": 400,
|
||||
}
|
||||
|
||||
def create_plot(
|
||||
self, loss_list, batch_list, validation_acc_list, epoch_list, training_acc_list
|
||||
):
|
||||
|
||||
if self.viz.check_connection():
|
||||
self.cur_batch_win = self.viz.line(
|
||||
torch.FloatTensor(loss_list),
|
||||
torch.FloatTensor(batch_list),
|
||||
win=self.cur_batch_win,
|
||||
name="current_batch_loss",
|
||||
update=(None if self.cur_batch_win is None else "replace"),
|
||||
opts=self.cur_batch_win_opts,
|
||||
)
|
||||
|
||||
self.cur_validation_acc = self.viz.line(
|
||||
torch.FloatTensor(validation_acc_list),
|
||||
torch.FloatTensor(epoch_list),
|
||||
win=self.cur_validation_acc,
|
||||
name="current_validation_accuracy",
|
||||
update=(None if self.cur_validation_acc is None else "replace"),
|
||||
opts=self.cur_validation_acc_opts,
|
||||
)
|
||||
|
||||
self.cur_training_acc = self.viz.line(
|
||||
torch.FloatTensor(training_acc_list),
|
||||
torch.FloatTensor(epoch_list),
|
||||
win=self.cur_validation_acc,
|
||||
name="current_training_accuracy",
|
||||
update=(None if self.cur_training_acc is None else "replace"),
|
||||
opts=self.cur_training_acc_opts,
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
Reference in New Issue
Block a user