Spaces:
Sleeping
Sleeping
import os | |
import numpy as np | |
import torch | |
import json | |
from enum import Enum | |
class ConfigEncoder(json.JSONEncoder): | |
def default(self, o): | |
if isinstance(o, type): | |
return {'$class': o.__module__ + "." + o.__name__} | |
elif isinstance(o, Enum): | |
return { | |
'$enum': o.__module__ + "." + o.__class__.__name__ + '.' + o.name | |
} | |
elif callable(o): | |
return { | |
'$function': o.__module__ + "." + o.__name__ | |
} | |
return json.JSONEncoder.default(self, o) | |
def count_parameters(model, trainable=False): | |
if trainable: | |
return sum(p.numel() for p in model.parameters() if p.requires_grad) | |
return sum(p.numel() for p in model.parameters()) | |
def tensor2numpy(x): | |
return x.cpu().data.numpy() if x.is_cuda else x.data.numpy() | |
def target2onehot(targets, n_classes): | |
onehot = torch.zeros(targets.shape[0], n_classes).to(targets.device) | |
onehot.scatter_(dim=1, index=targets.long().view(-1, 1), value=1.0) | |
return onehot | |
def makedirs(path): | |
if not os.path.exists(path): | |
os.makedirs(path) | |
def accuracy(y_pred, y_true, nb_old, increment=10): | |
assert len(y_pred) == len(y_true), "Data length error." | |
all_acc = {} | |
all_acc["total"] = np.around( | |
(y_pred == y_true).sum() * 100 / len(y_true), decimals=2 | |
) | |
# Grouped accuracy | |
for class_id in range(0, np.max(y_true), increment): | |
idxes = np.where( | |
np.logical_and(y_true >= class_id, y_true < class_id + increment) | |
)[0] | |
if increment == 1: | |
label = "{}".format( | |
str(class_id).rjust(2, "0") | |
) | |
else: | |
label = "{}-{}".format( | |
str(class_id).rjust(2, "0"), str(class_id + increment - 1).rjust(2, "0") | |
) | |
all_acc[label] = np.around( | |
(y_pred[idxes] == y_true[idxes]).sum() * 100 / len(idxes), decimals=2 | |
) | |
# Old accuracy | |
idxes = np.where(y_true < nb_old)[0] | |
all_acc["old"] = ( | |
0 | |
if len(idxes) == 0 | |
else np.around( | |
(y_pred[idxes] == y_true[idxes]).sum() * 100 / len(idxes), decimals=2 | |
) | |
) | |
# New accuracy | |
idxes = np.where(y_true >= nb_old)[0] | |
all_acc["new"] = np.around( | |
(y_pred[idxes] == y_true[idxes]).sum() * 100 / len(idxes), decimals=2 | |
) | |
return all_acc | |
def split_images_labels(imgs, start_index = 0): | |
# split trainset.imgs in ImageFolder | |
images = [] | |
labels = [] | |
for item in imgs: | |
images.append(item[0]) | |
labels.append(item[1] + start_index) | |
return np.array(images), np.array(labels) | |
def save_fc(args, model): | |
_path = os.path.join(args['logfilename'], "fc.pt") | |
if len(args['device']) > 1: | |
fc_weight = model._network.fc.weight.data | |
else: | |
fc_weight = model._network.fc.weight.data.cpu() | |
torch.save(fc_weight, _path) | |
_save_dir = os.path.join(f"./results/fc_weights/{args['prefix']}") | |
os.makedirs(_save_dir, exist_ok=True) | |
_save_path = os.path.join(_save_dir, f"{args['csv_name']}.csv") | |
with open(_save_path, "a+") as f: | |
f.write(f"{args['time_str']},{args['model_name']},{_path} \n") | |
def save_model(args, model): | |
#used in PODNet | |
_path = os.path.join(args['logfilename'], "model.pt") | |
if len(args['device']) > 1: | |
weight = model._network | |
else: | |
weight = model._network.cpu() | |
torch.save(weight, _path) |