Spaces:
Build error
Build error
| import json | |
| import copy | |
| import torch | |
| import numpy as np | |
| import contextlib | |
| from distutils.dir_util import mkpath | |
| from tqdm import tqdm | |
| def make_new_tensor_from_list(items, device_num, dtype=torch.float32): | |
| if device_num is not None: | |
| device = torch.device("cuda:{}".format(device_num)) | |
| else: | |
| device = torch.device("cpu") | |
| return torch.tensor(items, dtype=dtype, device=device) | |
| # is_dir look ast at whether the name we make | |
| # should be a directory or a filename | |
| def make_name(opt, prefix="", eval_=False, is_dir=True, set_epoch=None, | |
| do_epoch=True): | |
| string = prefix | |
| string += "{}-{}".format(opt.dataset, opt.exp) | |
| string += "/" | |
| string += "{}-{}-{}".format(opt.trainer, opt.cycle, opt.iters) | |
| string += "/" | |
| string += opt.model | |
| if opt.mle: | |
| string += "-{}".format(opt.mle) | |
| string += "/" | |
| string += make_name_string(opt.data) + "/" | |
| string += make_name_string(opt.net) + "/" | |
| string += make_name_string(opt.train.static) + "/" | |
| if eval_: | |
| string += make_name_string(opt.eval) + "/" | |
| # mkpath caches whether a directory has been created | |
| # In IPython, this can be a problem if the kernel is | |
| # not reset after a dir is deleted. Trying to recreate | |
| # that dir will be a problem because mkpath will think | |
| # the directory already exists | |
| if not is_dir: | |
| mkpath(string) | |
| string += make_name_string( | |
| opt.train.dynamic, True, do_epoch, set_epoch) | |
| if is_dir: | |
| mkpath(string) | |
| return string | |
| def make_name_string(dict_, final=False, do_epoch=False, set_epoch=None): | |
| if final: | |
| if not do_epoch: | |
| string = "{}_{}_{}".format( | |
| dict_.lr, dict_.optim, dict_.bs) | |
| elif set_epoch is not None: | |
| string = "{}_{}_{}_{}".format( | |
| dict_.lr, dict_.optim, dict_.bs, set_epoch) | |
| else: | |
| string = "{}_{}_{}_{}".format( | |
| dict_.lr, dict_.optim, dict_.bs, dict_.epoch) | |
| return string | |
| string = "" | |
| for k, v in dict_.items(): | |
| if type(v) == DD: | |
| continue | |
| if isinstance(v, list): | |
| val = "#".join(is_bool(str(vv)) for vv in v) | |
| else: | |
| val = is_bool(v) | |
| if string: | |
| string += "-" | |
| string += "{}_{}".format(k, val) | |
| return string | |
| def is_bool(v): | |
| if str(v) == "False": | |
| return "F" | |
| elif str(v) == "True": | |
| return "T" | |
| return v | |
| def generate_config_files(type_, key, name="base", eval_mode=False): | |
| with open("config/default.json".format(type_), "r") as f: | |
| base_config = json.load(f) | |
| with open("config/{}/default.json".format(type_), "r") as f: | |
| base_config_2 = json.load(f) | |
| if eval_mode: | |
| with open("config/{}/eval_changes.json".format(type_), "r") as f: | |
| changes_by_machine = json.load(f) | |
| else: | |
| with open("config/{}/changes.json".format(type_), "r") as f: | |
| changes_by_machine = json.load(f) | |
| base_config.update(base_config_2) | |
| if name in changes_by_machine: | |
| changes = changes_by_machine[name] | |
| else: | |
| changes = changes_by_machine["base"] | |
| # for param in changes[key]: | |
| # base_config[param] = changes[key][param] | |
| replace_params(base_config, changes[key]) | |
| mkpath("config/{}".format(type_)) | |
| with open("config/{}/config_{}.json".format(type_, key), "w") as f: | |
| json.dump(base_config, f, indent=4) | |
| def replace_params(base_config, changes): | |
| for param, value in changes.items(): | |
| if isinstance(value, dict) and param in base_config: | |
| replace_params(base_config[param], changes[param]) | |
| else: | |
| base_config[param] = value | |
| def initialize_progress_bar(data_loader_list): | |
| num_examples = sum([len(tensor) for tensor in | |
| data_loader_list.values()]) | |
| return set_progress_bar(num_examples) | |
| def set_progress_bar(num_examples): | |
| bar = tqdm(total=num_examples) | |
| bar.update(0) | |
| return bar | |
| def merge_list_of_dicts(L): | |
| result = {} | |
| for d in L: | |
| result.update(d) | |
| return result | |
| def return_iterator_by_type(data_type): | |
| if isinstance(data_type, dict): | |
| iterator = data_type.items() | |
| else: | |
| iterator = enumerate(data_type) | |
| return iterator | |
| def temp_seed(seed): | |
| state = np.random.get_state() | |
| np.random.seed(seed) | |
| try: | |
| yield | |
| finally: | |
| np.random.set_state(state) | |
| def flatten(outer): | |
| return [el for inner in outer for el in inner] | |
| def zipped_flatten(outer): | |
| return [(key, fill, el) for key, fill, inner in outer for el in inner] | |
| def remove_none(l): | |
| return [e for e in l if e is not None] | |
| # Taken from Jobman 0.1 | |
| class DD(dict): | |
| def __getattr__(self, attr): | |
| if attr == '__getstate__': | |
| return super(DD, self).__getstate__ | |
| elif attr == '__setstate__': | |
| return super(DD, self).__setstate__ | |
| elif attr == '__slots__': | |
| return super(DD, self).__slots__ | |
| return self[attr] | |
| def __setattr__(self, attr, value): | |
| # Safety check to ensure consistent behavior with __getattr__. | |
| assert attr not in ('__getstate__', '__setstate__', '__slots__') | |
| # if attr.startswith('__'): | |
| # return super(DD, self).__setattr__(attr, value) | |
| self[attr] = value | |
| def __str__(self): | |
| return 'DD%s' % dict(self) | |
| def __repr__(self): | |
| return str(self) | |
| def __deepcopy__(self, memo): | |
| z = DD() | |
| for k, kv in self.items(): | |
| z[k] = copy.deepcopy(kv, memo) | |
| return z | |