def train(param, x, y): dim_in = x.shape[1] device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') print(device) dataloader = DataLoader(torch.from_numpy(x.astype(np.float32)), batch_size=param.batch_size, shuffle=True, num_workers=2) flow = RealNVP(dim_in, device) flow.to(device) flow.train() optimizer = torch.optim.Adam( [p for p in flow.parameters() if p.requires_grad == True], lr=param.lr) it, print_cnt = 0, 0 while it < param.total_it: for i, data in enumerate(dataloader): loss = -flow.log_prob(data.to(device)).mean() optimizer.zero_grad() loss.backward(retain_graph=True) optimizer.step() it += data.shape[0] print_cnt += data.shape[0] if print_cnt > PRINT_FREQ: print('it {:d} -- loss {:.03f}'.format(it, loss)) print_cnt = 0 torch.save(flow.state_dict(), 'flow_model.pytorch')
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') print(device) x, y, scaler = load_data('lendingclub', is_tree=False, scaler_type='standardize') x = np.concatenate([x, np.zeros((x.shape[0], 1))], axis=1).astype(np.float32) flow = RealNVP(x.shape[1], device) if device.type == 'cpu': flow.load_state_dict(torch.load(args.model, map_location='cpu')) else: flow.load_state_dict(torch.load(args.model)) flow.to(device) flow.eval() # produce samples x_gen = flow.g(flow.prior.sample( (args.n_samples, ))).detach().cpu().numpy()[:, :-1] np.save('samples.npy', x_gen) df_x = scaler.as_dataframe(x[:, :-1]) df_gen = fix_df(x_gen, scaler) df_gen.to_csv('real.csv') # reconstruction quality --------------------- if args.quality: quality_test(df_x, df_gen, scaler)