def get_model(model_path, model_type): """ :param model_path: :param model_type: 'UNet', 'UNet11', 'UNet16', 'AlbuNet34' :return: """ num_classes = 1 if model_type == 'UNet11': model = UNet11(num_classes=num_classes) elif model_type == 'UNet16': model = UNet16(num_classes=num_classes) elif model_type == 'AlbuNet34': model = AlbuNet34(num_classes=num_classes) elif model_type == 'UNet': model = UNet(num_classes=num_classes) else: model = UNet(num_classes=num_classes) state = torch.load(str(model_path)) state = { key.replace('module.', ''): value for key, value in state['model'].items() } model.load_state_dict(state) if torch.cuda.is_available(): return model.cuda() model.eval() return model
def get_model(model_path, model_type): """ :param model_path: :param model_type: 'UNet', 'UNet11', 'UNet16', 'AlbuNet34' :return: """ num_classes = 1 if model_type == 'UNet11': model = UNet11(num_classes=num_classes) elif model_type == 'UNet16': model = UNet16(num_classes=num_classes) elif model_type == 'AlbuNet34': model = AlbuNet34(num_classes=num_classes) elif model_type == 'MDeNet': print('Mine MDeNet..................') model = MDeNet(num_classes=num_classes) elif model_type == 'EncDec': print('Mine EncDec..................') model = EncDec(num_classes=num_classes) elif model_type == 'hourglass': model = hourglass(num_classes=num_classes) elif model_type == 'MDeNetplus': print('load MDeNetplus..................') model = MDeNetplus(num_classes=num_classes) elif model_type == 'UNet': model = UNet(num_classes=num_classes) else: print('I am here') model = UNet(num_classes=num_classes) state = torch.load(str(model_path)) state = { key.replace('module.', ''): value for key, value in state['model'].items() } model.load_state_dict(state) if torch.cuda.is_available(): return model.cuda() model.eval() return model
def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--device-ids', type=str, default='0', help='For example 0,1 to run on two GPUs') arg('--fold-out', type=int, help='fold train test', default=0) arg('--fold-in', type=int, help='fold train val', default=0) arg('--percent', type=float, help='percent of data', default=1) arg('--root', default='runs/debug', help='checkpoint root') arg('--batch-size', type=int, default=4) arg('--limit', type=int, default=10000, help='number of images in epoch') arg('--n-epochs', type=int, default=40) arg('--n-steps', type=int, default=200) arg('--lr', type=float, default=0.003) arg('--modelVHR', type=str, default='UNet11', choices=['UNet11','UNet','AlbuNet34','SegNet']) arg('--dataset-path-HR', type=str, default='data_HR', help='ain path of the HR dataset') arg('--model-path-HR', type=str, default='logs_HR/mapping/model_40epoch_HR_UNet11.pth', help='path of the model of HR') arg('--dataset-path-VHR', type=str, default='data_VHR', help='ain path of the VHR dataset') arg('--name-file-HR', type=str, default='_HR', help='name file of HR dataset') arg('--dataset-file', type=str, default='VHR', help='main dataset resolution,depend of this correspond a specific crop' ) arg('--out-file', type=str, default='seq', help='the file in which save the outputs') arg('--train-val-file-HR', type=str, default='train_val_HR', help='name of the train-val file' ) arg('--test-file-HR', type=str, default='test_HR', help='name of the test file' ) arg('--train-val-file-VHR', type=str, default='train_val_850', help='name of the train-val file' ) arg('--test-file-VHR', type=str, default='test_850', help='name of the test file' ) args = parser.parse_args() root = Path(args.root) root.mkdir(exist_ok=True, parents=True) num_classes = 1 input_channels=4 if args.modelVHR == 'UNet11': model_VHR = UNet11(num_classes=num_classes, input_channels=input_channels) elif args.modelVHR == 'UNet': model_VHR = UNet(num_classes=num_classes, input_channels=input_channels) elif args.modelVHR == 'AlbuNet34': model_VHR =AlbuNet34(num_classes=num_classes, num_input_channels=input_channels, pretrained=False) elif args.modelVHR == 'SegNet': model_VHR = SegNet(num_classes=num_classes, num_input_channels=input_channels, pretrained=False) else: model_VHR = UNet11(num_classes=num_classes, input_channels=4) if torch.cuda.is_available(): if args.device_ids:# device_ids = list(map(int, args.device_ids.split(','))) else: device_ids = None model_VHR = nn.DataParallel(model_VHR, device_ids=device_ids).cuda() cudnn.benchmark = True out_path = Path(('logs_{}/mapping/').format(args.out_file)) #Data-paths:--------------------------VHr------------------------------------- data_path_VHR = Path(args.dataset_path_VHR) print("data_path:",data_path_VHR) name_file_VHR = '_'+ str(int(args.percent*100))+'_percent_'+args.out_file data_all='data' ##-------------------------------------- ############################ # NEstes cross validation K-fold train test ##train_val_file_names, test_file_names_HR = get_split_out(data_path_HR,data_all,args.fold_out) ############################ ############################ Cross validation train_val_file_names=np.array(sorted(glob.glob(str((data_path_VHR/args.train_val_file_VHR/'images'))+ "/*.npy"))) test_file_names_VHR = np.array(sorted(glob.glob(str((data_path_VHR/args.test_file_VHR/'images')) + "/*.npy"))) if args.percent !=1: extra, train_val_file_names= percent_split(train_val_file_names, args.percent) train_file_VHR_lab,val_file_VHR_lab = get_split_in(train_val_file_names,args.fold_in) np.save(str(os.path.join(out_path,"train_files{}_{}_fold{}_{}.npy".format(name_file_VHR, args.modelVHR, args.fold_out, args.fold_in))), train_file_VHR_lab) np.save(str(os.path.join(out_path,"val_files{}_{}_fold{}_{}.npy". format(name_file_VHR, args.modelVHR, args.fold_out, args.fold_in))), val_file_VHR_lab) #Data-paths:--------------------------unlabeled VHR------------------------------------- train_path_VHR_unlab= data_path_VHR/'unlabel'/'train'/'images' val_path_VHR_unlab = data_path_VHR/'unlabel'/'val'/'images' train_file_VHR_unlab = np.array(sorted(list(train_path_VHR_unlab.glob('*.npy')))) val_file_VHR_unlab = np.array(sorted(list(val_path_VHR_unlab.glob('*.npy')))) print('num train_lab = {}, num_val_lab = {}'.format(len(train_file_VHR_lab), len(val_file_VHR_lab))) print('num train_unlab = {}, num_val_unlab = {}'.format(len(train_file_VHR_unlab), len(val_file_VHR_unlab))) max_values_VHR, mean_values_VHR, std_values_VHR=meanstd(train_file_VHR_lab, val_file_VHR_lab,test_file_names_VHR,str(data_path_VHR),input_channels) def make_loader(file_names, shuffle=False, transform=None,mode='train',batch_size=4, limit=None): return DataLoader( dataset=WaterDataset(file_names, transform=transform,mode=mode, limit=limit), shuffle=shuffle, batch_size=batch_size, pin_memory=torch.cuda.is_available() ) #transformations --------------------------------------------------------------------------- train_transform_VHR = DualCompose([ CenterCrop(512), HorizontalFlip(), VerticalFlip(), Rotate(), ImageOnly(Normalize(mean=mean_values_VHR,std= std_values_VHR)) ]) val_transform_VHR = DualCompose([ CenterCrop(512), ImageOnly(Normalize(mean=mean_values_VHR, std=std_values_VHR)) ]) #------------------------------------------------------------------- mean_values_HR=(0.11952524, 0.1264638 , 0.13479991, 0.15017026) std_values_HR=(0.08844988, 0.07304429, 0.06740904, 0.11003125) train_transform_VHR_unlab = DualCompose([ CenterCrop(512), HorizontalFlip(), VerticalFlip(), Rotate(), ImageOnly(Normalize(mean=mean_values_HR,std= std_values_HR)) ]) val_transform_VHR_unlab = DualCompose([ CenterCrop(512), ImageOnly(Normalize(mean=mean_values_HR, std=std_values_HR)) ]) ######################## DATA-LOADERS ###########################################################49 train_loader_VHR_lab = make_loader(train_file_VHR_lab, shuffle=True, transform=train_transform_VHR , batch_size = 2, mode = "train") valid_loader_VHR_lab = make_loader(val_file_VHR_lab, transform=val_transform_VHR, batch_size = 4, mode = "train") train_loader_VHR_unlab = make_loader(train_file_VHR_unlab, shuffle=True, transform=train_transform_VHR, batch_size = 4, mode = "unlb_train") valid_loader_VHR_unlab = make_loader(val_file_VHR_unlab, transform=val_transform_VHR, batch_size = 2, mode = "unlb_val") dataloaders_VHR_lab= { 'train': train_loader_VHR_lab, 'val': valid_loader_VHR_lab } dataloaders_VHR_unlab= { 'train': train_loader_VHR_unlab, 'val': valid_loader_VHR_unlab } #---------------------------------------------- root.joinpath(('params_{}.json').format(args.out_file)).write_text( json.dumps(vars(args), indent=True, sort_keys=True)) # Observe that all parameters are being optimized optimizer_ft = optim.Adam(model_VHR.parameters(), lr= args.lr) exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=20, gamma=0.1) #--------------------------model HR------------------------------------- PATH_HR= args.model_path_HR #Initialise the model model_HR = UNet11(num_classes=num_classes) model_HR.cuda() model_HR.load_state_dict(torch.load(PATH_HR)) #--------------------------------------------------------------- model_VHR= utilsTrain_seq.train_model( out_file=args.out_file, name_file_VHR=name_file_VHR, model_HR=model_HR, model_VHR=model_VHR, optimizer=optimizer_ft, scheduler=exp_lr_scheduler, dataloaders_VHR_lab=dataloaders_VHR_lab, dataloaders_VHR_unlab=dataloaders_VHR_unlab, fold_out=args.fold_out, fold_in=args.fold_in, name_model_VHR=args.modelVHR, n_steps=args.n_steps, num_epochs=args.n_epochs ) torch.save(model_VHR.module.state_dict(), (str(out_path)+'/model{}_{}_foldout{}_foldin{}_{}epochs.pth').format(args.n_epochs,name_file_VHR,args.modelVHR, args.fold_out,args.fold_in,args.n_epochs)) print(args.modelVHR) max_values_all_VHR=3521 find_metrics(train_file_names=train_file_VHR_lab, val_file_names=val_file_VHR_lab, test_file_names=test_file_names_VHR, max_values=max_values_all_VHR, mean_values=mean_values_VHR, std_values=std_values_VHR, model=model_VHR, fold_out=args.fold_out, fold_in=args.fold_in, name_model=args.modelVHR, epochs=args.n_epochs, out_file=args.out_file, dataset_file=args.dataset_file, name_file=name_file_VHR)
def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--jaccard-weight', default=0.3, type=float) arg('--device-ids', type=str, default='0', help='For example 0,1 to run on two GPUs') arg('--fold', type=int, help='fold', default=0) arg('--root', default='runs/debug', help='checkpoint root') arg('--batch-size', type=int, default=1) arg('--limit', type=int, default=10000, help='number of images in epoch') arg('--n-epochs', type=int, default=100) arg('--lr', type=float, default=0.0001) arg('--workers', type=int, default=12) arg('--model', type=str, default='UNet', choices=['UNet', 'UNet11', 'UNet16', 'AlbuNet34']) args = parser.parse_args() root = Path(args.root) root.mkdir(exist_ok=True, parents=True) num_classes = 1 if args.model == 'UNet': model = UNet(num_classes=num_classes) elif args.model == 'UNet11': model = UNet11(num_classes=num_classes, pretrained=True) elif args.model == 'UNet16': model = UNet16(num_classes=num_classes, pretrained=True) elif args.model == 'LinkNet34': model = LinkNet34(num_classes=num_classes, pretrained=True) elif args.model == 'AlbuNet': model = AlbuNet34(num_classes=num_classes, pretrained=True) else: model = UNet(num_classes=num_classes, input_channels=3) if torch.cuda.is_available(): if args.device_ids: device_ids = list(map(int, args.device_ids.split(','))) else: device_ids = None model = nn.DataParallel(model, device_ids=device_ids).cuda() loss = LossBinary(jaccard_weight=args.jaccard_weight) cudnn.benchmark = True def make_loader(file_names, shuffle=False, transform=None, limit=None): return DataLoader(dataset=AngyodysplasiaDataset(file_names, transform=transform, limit=limit), shuffle=shuffle, num_workers=args.workers, batch_size=args.batch_size, pin_memory=torch.cuda.is_available()) train_file_names, val_file_names = get_split(args.fold) print('num train = {}, num_val = {}'.format(len(train_file_names), len(val_file_names))) train_transform = DualCompose([ SquarePaddingTraining(), CenterCrop([574, 574]), HorizontalFlip(), VerticalFlip(), Rotate(), ImageOnly(RandomHueSaturationValue()), ImageOnly(Normalize()) ]) val_transform = DualCompose([ SquarePaddingTraining(), CenterCrop([574, 574]), ImageOnly(Normalize()) ]) train_loader = make_loader(train_file_names, shuffle=True, transform=train_transform, limit=args.limit) valid_loader = make_loader(val_file_names, transform=val_transform) root.joinpath('params.json').write_text( json.dumps(vars(args), indent=True, sort_keys=True)) utils.train(init_optimizer=lambda lr: Adam(model.parameters(), lr=lr), args=args, model=model, criterion=loss, train_loader=train_loader, valid_loader=valid_loader, validation=validation_binary, fold=args.fold)
def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--jaccard-weight', default=0.3, type=float) arg('--device-ids', type=str, default='0', help='For example 0,1 to run on two GPUs') arg('--fold', type=int, help='fold', default=0) arg('--root', default='runs/debug', help='checkpoint root') arg('--batch-size', type=int, default=1) arg('--limit', type=int, default=10000, help='number of images in epoch') arg('--n-epochs', type=int, default=100) arg('--lr', type=float, default=0.001) arg('--workers', type=int, default=12) arg('--model', type=str, default='UNet', choices=['UNet', 'UNet11', 'LinkNet34', 'UNet16', 'AlbuNet34', 'MDeNet', 'EncDec', 'hourglass', 'MDeNetplus']) args = parser.parse_args() root = Path(args.root) root.mkdir(exist_ok=True, parents=True) num_classes = 1 if args.model == 'UNet': model = UNet(num_classes=num_classes) elif args.model == 'UNet11': model = UNet11(num_classes=num_classes, pretrained=True) elif args.model == 'UNet16': model = UNet16(num_classes=num_classes, pretrained=True) elif args.model == 'MDeNet': print('Mine MDeNet..................') model = MDeNet(num_classes=num_classes, pretrained=True) elif args.model == 'MDeNetplus': print('load MDeNetplus..................') model = MDeNetplus(num_classes=num_classes, pretrained=True) elif args.model == 'EncDec': print('Mine EncDec..................') model = EncDec(num_classes=num_classes, pretrained=True) elif args.model == 'GAN': model = GAN(num_classes=num_classes, pretrained=True) elif args.model == 'AlbuNet34': model = AlbuNet34(num_classes=num_classes, pretrained=False) elif args.model == 'hourglass': model = hourglass(num_classes=num_classes, pretrained=True) else: model = UNet(num_classes=num_classes, input_channels=3) if torch.cuda.is_available(): if args.device_ids: device_ids = list(map(int, args.device_ids.split(','))) else: device_ids = None model = nn.DataParallel(model).cuda() # nn.DataParallel(model, device_ids=device_ids).cuda() cudnn.benchmark = True def make_loader(file_names, shuffle=False, transform=None, limit=None): return DataLoader( dataset=Polyp(file_names, transform=transform, limit=limit), shuffle=shuffle, num_workers=args.workers, batch_size=args.batch_size, pin_memory=torch.cuda.is_available() ) train_file_names, val_file_names = get_split(args.fold) print('num train = {}, num_val = {}'.format(len(train_file_names), len(val_file_names))) train_transform = DualCompose([ CropCVC612(), img_resize(512), HorizontalFlip(), VerticalFlip(), Rotate(), Rescale(), Zoomin(), ImageOnly(RandomHueSaturationValue()), ImageOnly(Normalize()) ]) train_loader = make_loader(train_file_names, shuffle=True, transform=train_transform, limit=args.limit) root.joinpath('params.json').write_text( json.dumps(vars(args), indent=True, sort_keys=True)) utils.train( args=args, model=model, train_loader=train_loader, fold=args.fold )
args = parser.parse_args() root = Path(args.root) root.mkdir(exist_ok=True, parents=True) num_classes = 3 channels=list(map(int, args.channels.split(','))) #5 input_channels=len(channels) print('channels:',channels,'len',input_channels) if args.model == 'UNet11': model = UNet11(num_classes=num_classes, input_channels=input_channels) elif args.model == 'UNet': model = UNet(num_classes=num_classes, input_channels=input_channels) elif args.model == 'AlbuNet34': model = AlbuNet34(num_classes=num_classes, num_input_channels=input_channels, pretrained=False) elif args.model == 'SegNet': model = SegNet(num_classes=num_classes, num_input_channels=input_channels, pretrained=False) elif args.model == 'DeepLabV3': model = deeplabv3_resnet101(pretrained=False, progress=True, num_classes=num_classes) #model = models.segmentation.deeplabv3_resnet101(pretrained=False, progress=True, num_classes=num_classes) elif args.model == 'FCN': model = fcn_resnet101(pretrained=False, progress=True, num_classes=num_classes) else: model = UNet11(num_classes=num_classes, input_channels=input_channels) if torch.cuda.is_available(): if args.device_ids:# device_ids = list(map(int, args.device_ids.split(','))) else:
def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--device-ids', type=str, default='0', help='For example 0,1 to run on two GPUs') arg('--fold-out', type=int, default='0', help='fold train-val test') arg('--fold-in', type=int, default='0', help='fold train val') arg('--percent', type=float, default=1, help='percent of data') arg('--root', default='runs/debug', help='checkpoint root') arg('--batch-size', type=int, default=4, help='HR:4,VHR:8') arg('--limit', type=int, default=10000, help='number of images in epoch') arg('--n-epochs', type=int, default=40) arg('--lr', type=float, default=1e-3) arg('--model', type=str, default='UNet11', choices=['UNet11', 'UNet', 'AlbuNet34', 'SegNet']) arg('--dataset-path', type=str, default='data_VHR', help='main file,in which the dataset is: data_VHR or data_HR') arg('--dataset-file', type=str, default='VHR', help='resolution of the dataset VHR,HR') #arg('--out-file', type=str, default='VHR', help='the file in which save the outputs') arg('--train-val-file', type=str, default='train_val_850', help='name of the train-val file VHR:train_val_850 or train_val_HR') arg('--test-file', type=str, default='test_850', help='name of the test file VHR:test_850 or HR:test_HR') args = parser.parse_args() root = Path(args.root) root.mkdir(exist_ok=True, parents=True) num_classes = 1 input_channels = 4 if args.model == 'UNet11': model = UNet11(num_classes=num_classes, input_channels=input_channels) elif args.model == 'UNet': model = UNet(num_classes=num_classes, input_channels=input_channels) elif args.model == 'AlbuNet34': model = AlbuNet34(num_classes=num_classes, num_input_channels=input_channels, pretrained=False) elif args.model == 'SegNet': model = SegNet(num_classes=num_classes, num_input_channels=input_channels, pretrained=False) else: model = UNet11(num_classes=num_classes, input_channels=input_channels) if torch.cuda.is_available(): if args.device_ids: # device_ids = list(map(int, args.device_ids.split(','))) else: device_ids = None model = nn.DataParallel(model, device_ids=device_ids).cuda() cudnn.benchmark = True ####################Change the files_names ###################################### out_path = Path(('logs_{}/mapping/').format(args.dataset_file)) name_file = '_' + str(int( args.percent * 100)) + '_percent_' + args.dataset_file data_all = 'data' ##file with all the data data_path = Path(args.dataset_path) print("data_path:", data_path) ################################################################################# # Nested cross validation K-fold train test #train_val_file_names, test_file_names = get_split_out(data_path,data_all,args.fold_out) ################################################################################# #eWe are consider the same test in all the cases train_val_file_names = np.array( sorted( glob.glob( str(data_path / args.train_val_file / 'images') + "/*.npy"))) test_file_names = np.array( sorted( glob.glob(str(data_path / args.test_file / 'images') + "/*.npy"))) if args.percent != 1: extra, train_val_file_names = percent_split(train_val_file_names, args.percent) ################################################################################# train_file_names, val_file_names = get_split_in(train_val_file_names, args.fold_in) np.save( str( os.path.join( out_path, "train_files{}_{}_fold{}_{}.npy".format( name_file, args.model, args.fold_out, args.fold_in))), train_file_names) np.save( str( os.path.join( out_path, "val_files{}_{}_fold{}_{}.npy".format(name_file, args.model, args.fold_out, args.fold_in))), val_file_names) print('num train = {}, num_val = {}'.format(len(train_file_names), len(val_file_names))) def make_loader(file_names, shuffle=False, transform=None, mode='train', batch_size=4, limit=None): return DataLoader(dataset=WaterDataset(file_names, transform=transform, mode=mode, limit=limit), shuffle=shuffle, batch_size=batch_size, pin_memory=torch.cuda.is_available()) max_values, mean_values, std_values = meanstd(train_file_names, val_file_names, test_file_names, str(data_path), input_channels) #_60 print(max_values, mean_values, std_values) if (args.dataset_file == 'VHR'): train_transform = DualCompose([ CenterCrop(512), HorizontalFlip(), VerticalFlip(), Rotate(), ImageOnly(Normalize(mean=mean_values, std=std_values)) ]) val_transform = DualCompose([ CenterCrop(512), ImageOnly(Normalize(mean=mean_values, std=std_values)) ]) max_values = 3521 train_loader = make_loader(train_file_names, shuffle=True, transform=train_transform, mode='train', batch_size=args.batch_size) #4 batch_size valid_loader = make_loader(val_file_names, transform=val_transform, batch_size=args.batch_size, mode="train") if (args.dataset_file == 'HR'): train_transform = DualCompose([ CenterCrop(64), HorizontalFlip(), VerticalFlip(), Rotate(), ImageOnly(Normalize2(mean=mean_values, std=std_values)) ]) val_transform = DualCompose([ CenterCrop(64), ImageOnly(Normalize2(mean=mean_values, std=std_values)) ]) train_loader = make_loader(train_file_names, shuffle=True, transform=train_transform, mode='train', batch_size=args.batch_size) #8 batch_size valid_loader = make_loader(val_file_names, transform=val_transform, mode="train", batch_size=args.batch_size // 2) #albunet 34 with only 3 batch_size dataloaders = {'train': train_loader, 'val': valid_loader} dataloaders_sizes = {x: len(dataloaders[x]) for x in dataloaders.keys()} root.joinpath(('params_{}.json').format(args.dataset_file)).write_text( json.dumps(vars(args), indent=True, sort_keys=True)) optimizer_ft = optim.Adam(model.parameters(), lr=args.lr) # exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=20, gamma=0.1) utilsTrain.train_model(dataset_file=args.dataset_file, name_file=name_file, model=model, optimizer=optimizer_ft, scheduler=exp_lr_scheduler, dataloaders=dataloaders, fold_out=args.fold_out, fold_in=args.fold_in, name_model=args.model, num_epochs=args.n_epochs) torch.save( model.module.state_dict(), (str(out_path) + '/model{}_{}_foldout{}_foldin{}_{}epochs').format( name_file, args.model, args.fold_out, args.fold_in, args.n_epochs)) print(args.model) find_metrics(train_file_names=train_file_names, val_file_names=val_file_names, test_file_names=test_file_names, max_values=max_values, mean_values=mean_values, std_values=std_values, model=model, fold_out=args.fold_out, fold_in=args.fold_in, name_model=args.model, epochs=args.n_epochs, out_file=args.dataset_file, dataset_file=args.dataset_file, name_file=name_file)
def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--jaccard-weight', default=0.3, type=float) arg('--device-ids', type=str, default='0', help='For example 0,1 to run on two GPUs') arg('--fold', type=int, help='fold', default=0) arg('--root', default='runs/debug', help='checkpoint root') arg('--batch-size', type=int, default=1) arg('--limit', type=int, default=10000, help='number of images in epoch') arg('--n-epochs', type=int, default=100) arg('--lr', type=float, default=0.0001) arg('--workers', type=int, default=12) arg("--b1", type=float, default=0.5, help="adam: decay of first order momentum of gradient") arg("--b2", type=float, default=0.999, help="adam: decay of first order momentum of gradient") args = parser.parse_args() root = Path(args.root) root.mkdir(exist_ok=True, parents=True) # Loss functions criterion_GAN = GAN_loss(gan_weight=1) #torch.nn.MSELoss() criterion_pixelwise = torch.nn.L1Loss() criterion_discrim = Discrim_loss(dircrim_weight=1) # Loss weight of L1 pixel-wise loss between translated image and real image lambda_pixel = 100 # Initialize generator and discriminator model = AlbuNet34(num_classes=1, pretrained=True) discrim_model = discriminator() if torch.cuda.is_available(): if args.device_ids: device_ids = list(map(int, args.device_ids.split(','))) else: device_ids = None model = nn.DataParallel(model, device_ids=device_ids).cuda() discrim_model = nn.DataParallel(discrim_model, device_ids=device_ids).cuda() # Load pretrained models root = Path(args.root) model_path = root / 'model_{fold}.pt'.format(fold=args.fold) if model_path.exists(): state = torch.load(str(model_path)) epoch = state['epoch'] step = state['step'] model.load_state_dict(state['model']) print('Restored model, epoch {}, step {:,}'.format(epoch, step)) else: epoch = 1 step = 0 save = lambda ep: torch.save( { 'model': model.state_dict(), 'epoch': ep, 'step': step, }, str(model_path)) # Optimizers optimizer_G = Adam(model.parameters(), lr=args.lr, betas=(args.b1, args.b2)) optimizer_D = Adam(discrim_model.parameters(), lr=args.lr, betas=(args.b1, args.b2)) # Configure dataloaders def make_loader(file_names, shuffle=False, transform=None, limit=None): return DataLoader(dataset=Polyp(file_names, transform=transform, limit=limit), shuffle=shuffle, num_workers=args.workers, batch_size=args.batch_size, pin_memory=torch.cuda.is_available()) train_file_names, val_file_names = get_split(args.fold) print('num train = {}, num_val = {}'.format(len(train_file_names), len(val_file_names))) train_transform = DualCompose([ CropCVC612(), img_resize(512), HorizontalFlip(), VerticalFlip(), Rotate(), Rescale(), Zoomin(), ImageOnly(RandomHueSaturationValue()), ImageOnly(Normalize()) ]) train_loader = make_loader(train_file_names, shuffle=True, transform=train_transform, limit=args.limit) root.joinpath('params.json').write_text( json.dumps(vars(args), indent=True, sort_keys=True)) report_each = 10 log = root.joinpath('train_{fold}.log'.format(fold=args.fold)).open( 'at', encoding='utf8') for epoch in range(epoch, args.n_epochs + 1): model.train() discrim_model.train() random.seed() tq = tqdm.tqdm(total=(len(train_loader) * args.batch_size)) tq.set_description('Epoch {}, lr {}'.format(epoch, args.lr)) losses = [] tl = train_loader try: mean_loss = 0 for i, (inputs, targets) in enumerate(tl): # Model inputs inputs, targets = variable(inputs), variable(targets) # ------------------ # Train Generators # ------------------ optimizer_G.zero_grad() # Generate output outputs = model(inputs) # fake loss predict_fake = discrim_model(inputs, outputs) # Pixel-wise loss loss_pixel = criterion_pixelwise(outputs, targets) # Generator loss loss_GAN = criterion_GAN(predict_fake) # Total loss of GAN loss_G = loss_GAN + lambda_pixel * loss_pixel loss_G.backward() optimizer_G.step() # --------------------- # Train Discriminator # --------------------- optimizer_D.zero_grad() # Real loss predict_real = discrim_model(inputs, targets) predict_fake = discrim_model(inputs, outputs.detach()) # Discriminator loss loss_D = criterion_discrim(predict_real, predict_fake) loss_D.backward() optimizer_D.step() step += 1 batch_size = inputs.size(0) tq.update(batch_size) losses.append(float(loss_G.data)) mean_loss = np.mean(losses[-report_each:]) tq.set_postfix(loss='{:.5f}'.format(mean_loss)) if i and i % report_each == 0: write_event(log, step, loss=mean_loss) write_event(log, step, loss=mean_loss) tq.close() save(epoch + 1) except KeyboardInterrupt: tq.close() print('Ctrl+C, saving snapshot') save(epoch) print('done.') return