def main(args): visenv_name = args.dataset exp_dir = os.path.join('exp_result', args.dataset) model_dir, log_dir = get_model_log_path(exp_dir, visenv_name) stdout_file = os.path.join(log_dir, f'stdout_{time_str()}.txt') save_model_path = os.path.join(model_dir, 'ckpt_max.pth') if args.redirector: print('redirector stdout') ReDirectSTD(stdout_file, 'stdout', False) pprint.pprint(OrderedDict(args.__dict__)) print('-' * 60) print(f'use GPU{args.device} for training') print(f'train set: {args.dataset} {args.train_split}, test set: {args.valid_split}') train_tsfm, valid_tsfm = get_transform(args) print(train_tsfm) train_set = AttrDataset(args=args, split=args.train_split, transform=train_tsfm) train_loader = DataLoader( dataset=train_set, batch_size=args.batchsize, shuffle=True, num_workers=0, pin_memory=True, ) valid_set = AttrDataset(args=args, split=args.valid_split, transform=valid_tsfm) valid_loader = DataLoader( dataset=valid_set, batch_size=args.batchsize, shuffle=False, num_workers=0, pin_memory=True, ) print(f'{args.train_split} set: {len(train_loader.dataset)}, ' f'{args.valid_split} set: {len(valid_loader.dataset)}, ' f'attr_num : {train_set.attr_num}') labels = train_set.label # sample_weight = labels.mean(0) # sample_weight = labels[labels!=2].reshape((labels.shape[0], labels.shape[1])).mean(0) sample_weight = np.nanmean(np.where(labels!=2,labels,np.nan), axis=0) backbone = getattr(sys.modules[__name__], args.model)() if "dpn68" in args.model: net_parameter = 832 elif "dpn" in args.model: net_parameter = 2688 elif "densenet" in args.model: net_parameter = 1024 else: net_parameter = 2048 classifier = BaseClassifier(netpara=net_parameter, nattr=train_set.attr_num) model = FeatClassifier(backbone, classifier) if torch.cuda.is_available(): model = torch.nn.DataParallel(model).cuda() criterion = CEL_Sigmoid(sample_weight) if torch.cuda.is_available(): param_groups = [{'params': model.module.finetune_params(), 'lr': args.lr_ft}, {'params': model.module.fresh_params(), 'lr': args.lr_new}] else: param_groups = [{'params': model.finetune_params(), 'lr': args.lr_ft}, {'params': model.fresh_params(), 'lr': args.lr_new}] optimizer = torch.optim.SGD(param_groups, momentum=args.momentum, weight_decay=args.weight_decay, nesterov=False) lr_scheduler = ReduceLROnPlateau(optimizer, factor=0.1, patience=4) best_metric, epoch = trainer(epoch=args.train_epoch, model=model, train_loader=train_loader, valid_loader=valid_loader, criterion=criterion, optimizer=optimizer, lr_scheduler=lr_scheduler, path=save_model_path) print(f'{visenv_name}, best_metrc : {best_metric} in epoch{epoch}')
def main(args): visenv_name = args.dataset exp_dir = os.path.join('exp_result', args.dataset) model_dir, log_dir = get_model_log_path(exp_dir, visenv_name) # Added for logging purposes user = getpass.getuser() fixed_time_str = time_str() stdout_file = os.path.join( log_dir, "_".join(['stdout', user, f'{fixed_time_str}.txt'])) save_model_path = os.path.join( model_dir, "_".join(['ckpt_max', user, f'{fixed_time_str}.pth'])) trackitems_dir = os.path.join( log_dir, "_".join(['trackitems', user, f'{fixed_time_str}.txt'])) if args.redirector: print('redirector stdout') ReDirectSTD(stdout_file, 'stdout', False) pprint.pprint(OrderedDict(args.__dict__)) print('-' * 60) print(f'use GPU{args.device} for training') print( f'train set: {args.dataset} {args.train_split}, test set: {args.valid_split}' ) train_tsfm, valid_tsfm = get_transform(args) print(train_tsfm) #train_set = AttrDataset(args=args, split=args.train_split, transform=train_tsfm) train_set = AttrDataset_new(args=args, split=args.train_split, transformation_dict=args.train_transform) train_loader = DataLoader( dataset=train_set, batch_size=args.batchsize, shuffle=True, num_workers=8, pin_memory=True, ) #valid_set = AttrDataset(args=args, split=args.valid_split, transform=valid_tsfm) valid_set = AttrDataset_new(args=args, split=args.valid_split, transformation_dict=args.valid_transform) valid_loader = DataLoader( dataset=valid_set, batch_size=args.batchsize, shuffle=False, num_workers=8, pin_memory=True, ) print(f'{args.train_split} set: {len(train_loader.dataset)}, ' f'{args.valid_split} set: {len(valid_loader.dataset)}, ' f'attr_num : {train_set.attr_num}') labels = train_set.label # sample_weight = labels.mean(0) sample_weight = np.nanmean(np.where(labels != 2, labels, np.nan), axis=0) backbone = getattr(sys.modules[__name__], args.model)() if "dpn68" in args.model: net_parameter = 832 elif "dpn" in args.model: net_parameter = 2688 elif "densenet" in args.model: net_parameter = 1024 else: net_parameter = 2048 classifier = BaseClassifier(netpara=net_parameter, nattr=train_set.attr_num) model = FeatClassifier(backbone, classifier) if torch.cuda.is_available(): model = torch.nn.DataParallel(model).cuda() criterion = CEL_Sigmoid(sample_weight) if torch.cuda.is_available(): param_groups = [{ 'params': model.module.finetune_params(), 'lr': args.lr_ft }, { 'params': model.module.fresh_params(), 'lr': args.lr_new }] else: param_groups = [{ 'params': model.finetune_params(), 'lr': args.lr_ft }, { 'params': model.fresh_params(), 'lr': args.lr_new }] optimizer = torch.optim.SGD(param_groups, momentum=args.momentum, weight_decay=args.weight_decay, nesterov=False) lr_scheduler = ReduceLROnPlateau(optimizer, factor=0.1, patience=4) # Added for logging purposes with open(trackitems_dir, "a") as f: code, line_no = inspect.getsourcelines(get_transform) for line in code: f.write(str(line)) f.write(str("\n\n")) f.write(str(args.__dict__)) f.write(str("\n\n")) f.write(str(lr_scheduler.__dict__)) f.write(str("\n\n")) model_str = str(model).lower() have_dropout = 'dropout' in model_str f.write('dropout: %s' % (have_dropout)) f.write(str("\n\n")) have_leaky_relu = 'leaky_relu' in model_str f.write('leaky_relu: %s' % (have_leaky_relu)) f.write(str("\n\n")) best_metric, epoch = trainer(epoch=args.train_epoch, model=model, train_loader=train_loader, valid_loader=valid_loader, criterion=criterion, optimizer=optimizer, lr_scheduler=lr_scheduler, path=save_model_path, measure="f1") print(f'{visenv_name}, best_metrc : {best_metric} in epoch{epoch}') # Added for logging purposes with open(trackitems_dir, "a") as f: f.write(f'{visenv_name}, best_metrc : {best_metric} in epoch{epoch}') f.write("\n\n")