def train(self): num_epochs = self.hyperparams.epochs start_epoch = self.hyperparams.start_epoch if hasattr( self.hyperparams, 'start_epoch') else 0 for epoch in range(start_epoch, num_epochs): if hasattr(self.conf, 'epoch'): self.conf.epoch.value = epoch print(self.conf.epoch) self.model.train() try: self.conf.lr_scheduler.step() print( f'Elapsed time: {datetime.datetime.now() - self.experiment_start}' ) for group in self.optimizer.param_groups: print('LR: {:.4e}'.format(group['lr'])) eval_epoch = ((epoch % self.conf.eval_each == 0) or (epoch == num_epochs - 1)) # and (epoch > 0) self.model.criterion.step_counter = 0 print(f'Epoch: {epoch} / {num_epochs - 1}') if eval_epoch and not self.args.dry: print("Experiment dir: %s" % self.experiment_dir) batch_iterator = iter(enumerate(self.loader_train)) start_t = perf_counter() for step, batch in batch_iterator: self.optimizer.zero_grad() loss = self.model.loss(batch) loss.backward() self.optimizer.step() if step % 80 == 0 and step > 0: curr_t = perf_counter() print( f'{(step * self.conf.batch_size) / (curr_t - start_t):.2f}fps' ) if not self.args.dry: store(self.model, self.store_path, 'model') store(self.optimizer, self.store_path, 'optimizer') if eval_epoch and self.args.eval: print('Evaluating model') iou, per_class_iou = evaluate_semseg( self.model, self.loader_val, self.dataset_val.class_info) self.validation_ious += [iou] if self.args.eval_train: print('Evaluating train') evaluate_semseg(self.model, self.loader_train, self.dataset_train.class_info) if iou > self.best_iou: self.best_iou = iou self.best_iou_epoch = epoch if not self.args.dry: copy(self.store_path.format('model'), self.store_path.format('model_best')) print( f'Best mIoU: {self.best_iou:.2f}% (epoch {self.best_iou_epoch})' ) except KeyboardInterrupt: break
def eval(config='configs/pyramid.py'): conf_path = Path(config) conf = import_module(config) class_info = conf.dataset_val.class_info model = conf.model.cuda() for loader, name in conf.eval_loaders: iou_acc = evaluate_semseg(model, loader, class_info, observers=conf.eval_observers) print(f'{name}: {iou_acc:.2f}') # Note: we are expecting only one loader (val) return iou_acc
import argparse from pathlib import Path import importlib.util from evaluation import evaluate_semseg def import_module(path): spec = importlib.util.spec_from_file_location("module", path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module parser = argparse.ArgumentParser(description='Detector train') parser.add_argument('config', type=str, help='Path to configuration .py file') parser.add_argument('--profile', dest='profile', action='store_true', help='Profile one forward pass') if __name__ == '__main__': args = parser.parse_args() conf_path = Path(args.config) conf = import_module(args.config) class_info = conf.dataset_val.class_info model = conf.model.cuda() for loader, name in conf.eval_loaders: iou, per_class_iou = evaluate_semseg(model, loader, class_info, observers=conf.eval_observers) print(f'{name}: {iou:.2f}')
BasicBlock = BasicBlock34 else: BasicBlock = BasicBlock_SN store_dir = Path(args.store_dir) store_stats_path = store_dir / "params_mious.txt" os.makedirs(str(store_dir), exist_ok=True) store_data(store_stats_path, "Params", "mIoU", "GMACs", "FPS") pruning_percentages = conf.pruning_percentages print("PRUNING PERCENTAGES: ", pruning_percentages) pruning_indices = reset_pruning_indices(conf.model, BasicBlock) print("INITIAL TESTING:") print("MODEL:\n", conf.model) iou, per_class_iou = evaluate_semseg(conf.model.cuda(), conf.loader_val, conf.dataset_val.class_info) params, macs, fps = measure_gmacs_fps() store_data(store_stats_path, params, iou, macs, fps) for i in range(10): if i != 0: iou, per_class_iou = evaluate_semseg(conf.model.cuda(), conf.loader_val, conf.dataset_val.class_info) conf.model.to("cpu") if conf.prune_mode == "rewind": model, prune_stats, _ = prune_with_rewinding() elif conf.prune_mode == "reset": model, prune_stats = prune_with_resetting() else: