def generate_videos(args, eigenvectors): clips_dir = os.path.join(args.out, 'videos') if not os.path.isdir(clips_dir): os.mkdir(clips_dir) if args.samples_for_videos is None: dim_z = load_generator(args.__dict__, args.gan_weights).dim_z zs = torch.randn((4, dim_z)).cuda() else: zs = torch.load(args.samples_for_videos).cuda() print('Making videos...') for i, eigenvector in tqdm(enumerate(eigenvectors)): eigenvector = eigenvector.cuda() for amplitude in [10, 50, 100, 200, 500]: generator = load_generator(args.__dict__, args.gan_weights) wd = ConstantWeightDeformator( generator=generator, conv_layer_ix=args.gan_conv_layer_index, direction=eigenvector) clip_path = os.path.join(clips_dir, f'direction{i}_amplitude{amplitude}') make_video(generator=generator, zs=zs, wd=wd, file_dest=clip_path, shift_from=-amplitude, shift_to=amplitude, step=amplitude / 50., interpolate=args.video_interpolate)
def objective(trial: optuna.trial.Trial): print(f"[Optuna]: Trial #{trial.number}") G = load_generator(args.__dict__, weights_path, args.w_shift) params = Params(**args.__dict__) params.batch_size = 128 params.directions_count = 200 params.deformator_lr = trial.suggest_float("deformator_lr", 1e-4, 1e-4, log=True) params.shift_predictor_lr = params.deformator_lr # params.torch_grad = True if trial.suggest_int("torch_grad", 0, 1) else False deformator = LatentDeformator(shift_dim=G.dim_shift, input_dim=params.directions_count, out_dim=params.max_latent_dim, type=DEFORMATOR_TYPE_DICT[args.deformator], random_init=args.deformator_random_init ).cuda() # deformator = MyDeformator(48*8*8, 48*8*8) if args.shift_predictor == 'ResNet': shift_predictor = LatentShiftPredictor(params.directions_count, args.shift_predictor_size).cuda() elif args.shift_predictor == 'LeNet': shift_predictor = LeNetShiftPredictor( params.directions_count, 1 if args.gan_type == 'SN_MNIST' else 3).cuda() # training args.shift_distribution = SHIFT_DISTRIDUTION_DICT[args.shift_distribution_key] # update dims with respect to the deformator if some of params are None params.directions_count = int(deformator.input_dim) params.max_latent_dim = int(deformator.out_dim) trainer = Trainer(params, out_dir=args.out, verbose=True) loss = trainer.train(G, deformator, shift_predictor, multi_gpu=args.multi_gpu, trial=trial) # my_save_results_charts(G, deformator, params, trainer.log_dir) compute_DVN(G, deformator, f'DVN_{args.gan_type}_{args.deformator}_{params.directions_count}.pt') return loss
parser.add_argument('--epsilon', type=float, default=0.1) parser.add_argument('--lpips_net', type=str, default='vgg') parser.add_argument('--make_videos', type=bool, default=True) parser.add_argument('--samples_for_videos', type=str, default=None) parser.add_argument('--out', type=str, required=True) parser.add_argument('--lpips_interpolation_size', type=int, default=64) parser.add_argument('--video_interpolate', type=int, default=None) args = parser.parse_args() if not os.path.exists(args.out): print(f'Out: {args.out}') os.mkdir(args.out) lpips_model = lpips.LPIPS(net=args.lpips_net).cuda() generator = load_generator(args.__dict__, args.gan_weights) hvp = HVP_forward(generator=generator, lpips_model=lpips_model, conv_layer_ix=args.gan_conv_layer_index, batch_size=args.batch_size, cache_path=args.out, lpips_interpolation_size=args.lpips_interpolation_size) eigenvectors = hvp.find_top_n_eigenvectors(n=args.num_eigenvectors, num_samples=args.num_samples, max_iter=args.max_iter, epsilon=args.epsilon) eigenvectors = torch.stack([ F.normalize(eig.view(-1), p=2, dim=0).view(eig.shape)
def main(): parser = argparse.ArgumentParser(description='Latent space rectification') for key, val in Params().__dict__.items(): target_type = type(val) if val is not None else int parser.add_argument('--{}'.format(key), type=target_type, default=None) parser.add_argument('--out', type=str, required=True, help='results directory') parser.add_argument('--gan_type', type=str, choices=WEIGHTS.keys(), help='generator model type') parser.add_argument('--gan_weights', type=str, default=None, help='path to generator weights') parser.add_argument('--resolution', type=int, required=True) parser.add_argument('--target_class', nargs='+', type=int, default=[239], help='classes to use for conditional GANs') parser.add_argument('--deformator', type=str, default='ortho', choices=DEFORMATOR_TYPE_DICT.keys(), help='deformator type') parser.add_argument('--deformator_random_init', type=bool, default=True) parser.add_argument('--deformator_target', type=str, default='latent', choices=DEFORMATOR_TARGET_DICT.keys()) parser.add_argument('--deformator_conv_layer_index', type=int, default=3) parser.add_argument('--basis_vectors_path', type=str) parser.add_argument('--shift_predictor_size', type=int, help='reconstructor resolution') parser.add_argument('--shift_predictor', type=str, choices=['ResNet', 'LeNet'], default='ResNet', help='reconstructor type') parser.add_argument('--shift_distribution_key', type=str, choices=SHIFT_DISTRIDUTION_DICT.keys()) parser.add_argument('--make_videos', type=bool, default=True) parser.add_argument('--samples_for_videos', type=str, default=None) parser.add_argument('--video_interpolate', type=int, default=None) parser.add_argument('--seed', type=int, default=2) parser.add_argument('--device', type=int, default=0) parser.add_argument('--multi_gpu', type=bool, default=False, help='Run generator in parallel. Be aware of old pytorch versions:\ https://github.com/pytorch/pytorch/issues/17345') # model-specific parser.add_argument('--w_shift', type=bool, default=True, help='latent directions search in w-space for StyleGAN') args = parser.parse_args() torch.cuda.set_device(args.device) random.seed(args.seed) torch.random.manual_seed(args.seed) save_command_run_params(args) # init models if args.gan_weights is not None: weights_path = args.gan_weights else: weights_path = WEIGHTS[args.gan_type] G = load_generator(args.__dict__, weights_path, args.w_shift) if args.deformator_target == 'latent': deformator = LatentDeformator( shift_dim=G.dim_shift, input_dim=args.directions_count, out_dim=args.max_latent_dim, type=DEFORMATOR_TYPE_DICT[args.deformator], random_init=args.deformator_random_init ).cuda() elif args.deformator_target == 'weight_svd': deformator = WeightDeformatorSVDBasis( generator=G, conv_layer_ix=args.deformator_conv_layer_index, directions_count=args.directions_count ).cuda() G = G.cuda() dim_shift = args.directions_count elif args.deformator_target == 'weight_fixedbasis': assert args.basis_vectors_path is not None deformator = WeightDeformatorFixedBasis( generator=G, conv_layer_ix=args.deformator_conv_layer_index, directions_count=args.directions_count, basis_vectors_path=args.basis_vectors_path ).cuda() G = G.cuda() dim_shift = args.directions_count else: raise ValueError("Unknown deformator_target") if args.shift_predictor == 'ResNet': shift_predictor = LatentShiftPredictor( dim_shift, args.shift_predictor_size).cuda() elif args.shift_predictor == 'LeNet': shift_predictor = LeNetShiftPredictor( dim_shift, 1 if args.gan_type == 'SN_MNIST' else 3).cuda() # training args.shift_distribution = SHIFT_DISTRIDUTION_DICT[args.shift_distribution_key] params = Params(**args.__dict__) # update dims with respect to the deformator if some of params are None if args.deformator_target == 'latent': params.directions_count = int(deformator.input_dim) params.max_latent_dim = int(deformator.out_dim) trainer = Trainer(params, out_dir=args.out) trainer.train(G, deformator, shift_predictor, multi_gpu=args.multi_gpu) if args.make_videos: if 'weight_' not in args.deformator_target: sys.stderr.write("Making video is available only for weight deformations.\n") else: generate_videos(args, G, deformator) if args.deformator_target == 'latent': save_results_charts(G, deformator, params, trainer.log_dir)
def main(): parser = argparse.ArgumentParser(description='Latent space rectification') for key, val in Params().__dict__.items(): target_type = type(val) if val is not None else int parser.add_argument('--{}'.format(key), type=target_type, default=None) parser.add_argument('--out', type=str, required=True, help='results directory') parser.add_argument('--gan_type', type=str, choices=WEIGHTS.keys(), help='generator model type') parser.add_argument('--gan_weights', type=str, default=None, help='path to generator weights') parser.add_argument('--target_class', nargs='+', type=int, default=[239], help='classes to use for conditional GANs') parser.add_argument('--deformator', type=str, default='ortho', choices=DEFORMATOR_TYPE_DICT.keys(), help='deformator type') parser.add_argument('--deformator_random_init', type=bool, default=True) parser.add_argument('--shift_predictor_size', type=int, help='reconstructor resolution') parser.add_argument('--shift_predictor', type=str, choices=['ResNet', 'LeNet'], default='ResNet', help='reconstructor type') parser.add_argument('--shift_distribution_key', type=str, choices=SHIFT_DISTRIDUTION_DICT.keys()) parser.add_argument('--seed', type=int, default=2) parser.add_argument('--device', type=int, default=0) parser.add_argument( '--multi_gpu', type=bool, default=False, help='Run generator in parallel. Be aware of old pytorch versions:\ https://github.com/pytorch/pytorch/issues/17345') # model-specific parser.add_argument( '--w_shift', type=bool, default=True, help='latent directions search in w-space for StyleGAN') args = parser.parse_args() torch.cuda.set_device(args.device) random.seed(args.seed) torch.random.manual_seed(args.seed) save_command_run_params(args) # init models if args.gan_weights is not None: weights_path = args.gan_weights else: weights_path = WEIGHTS[args.gan_type] G = load_generator(args.__dict__, weights_path, args.w_shift) deformator = LatentDeformator( shift_dim=G.dim_shift, input_dim=args.directions_count, out_dim=args.max_latent_dim, type=DEFORMATOR_TYPE_DICT[args.deformator], random_init=args.deformator_random_init).cuda() if args.shift_predictor == 'ResNet': shift_predictor = LatentShiftPredictor( G.dim_shift, args.shift_predictor_size).cuda() elif args.shift_predictor == 'LeNet': shift_predictor = LeNetShiftPredictor( G.dim_shift, 1 if args.gan_type == 'SN_MNIST' else 3).cuda() # training args.shift_distribution = SHIFT_DISTRIDUTION_DICT[ args.shift_distribution_key] params = Params(**args.__dict__) # update dims with respect to the deformator if some of params are None params.directions_count = int(deformator.input_dim) params.max_latent_dim = int(deformator.out_dim) trainer = Trainer(params, out_dir=args.out) trainer.train(G, deformator, shift_predictor, multi_gpu=args.multi_gpu) save_results_charts(G, deformator, params, trainer.log_dir)