Spaces:
Runtime error
Runtime error
| 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) |