class RolloutGenerator(object): def __init__(self, ga): # ga reference self.ga = ga # compressor model self.vae = ga.compressor # controller model; trained on the go self.controller = Controller(ga.input_size, ga.output_size).cuda() def get_action(self, obs, bodystate, brushstate, pulse): bodystate_comp = torch.cat( (bodystate, brushstate, pulse)) if self.ga.cpg_enabled else torch.cat( (bodystate, brushstate)) latent_mu, _ = self.vae.cuda().encoder(obs.cuda()) action = self.controller.cuda().forward( latent_mu.flatten(), bodystate_comp.cuda().flatten()) return action.squeeze().cpu().numpy() def do_rollout(self, generation, id, early_termination=True): with torch.no_grad(): client = Client(ClientType.ROLLOUT, self.ga.obs_size) client.start(generation, id, rollout=self)
]) trained=0 #model = VAE(3, LSIZE).to(device) model=VAE(3, LSIZE) model=torch.nn.DataParallel(model,device_ids=range(8)) model.cuda() optimizer = optim.Adam(model.parameters(),lr=learning_rate,betas=(0.9,0.999)) model_p=VAE_a(7, LSIZE) model_p=torch.nn.DataParallel(model_p,device_ids=range(8)) model_p.cuda() optimizer_p = optim.Adam(model_p.parameters(),lr=learning_rate,betas=(0.9,0.999)) controller=Controller(LSIZE,3) controller=torch.nn.DataParallel(controller,device_ids=range(8)) controller=controller.cuda() optimizer_a = optim.SGD(controller.parameters(),lr=learning_rate*10) # scheduler = ReduceLROnPlateau(optimizer, 'min', factor=0.5, patience=5) # earlystopping = EarlyStopping('min', patience=30) vis = visdom.Visdom(env='pa_train') current_window = vis.image( np.random.rand(64, 64), opts=dict(title='current!', caption='current.'), ) recon_window = vis.image( np.random.rand(64, 64), opts=dict(title='Reconstruction!', caption='Reconstruction.'), ) mask_window = vis.image(
def main(): global args np.random.seed(args.seed) torch.cuda.manual_seed(args.seed) if args.fixed_arc: sys.stdout = Logger(filename='logs/' + args.output_filename + '_fixed.log') else: sys.stdout = Logger(filename='logs/' + args.output_filename + '.log') print(args) data_loaders = load_datasets() controller = Controller(search_for=args.search_for, search_whole_channels=True, num_layers=args.child_num_layers, num_branches=args.child_num_branches, out_filters=args.child_out_filters, lstm_size=args.controller_lstm_size, lstm_num_layers=args.controller_lstm_num_layers, tanh_constant=args.controller_tanh_constant, temperature=None, skip_target=args.controller_skip_target, skip_weight=args.controller_skip_weight) controller = controller.cuda() shared_cnn = SharedCNN(num_layers=args.child_num_layers, num_branches=args.child_num_branches, out_filters=args.child_out_filters, keep_prob=args.child_keep_prob) shared_cnn = shared_cnn.cuda() # https://github.com/melodyguan/enas/blob/master/src/utils.py#L218 controller_optimizer = torch.optim.Adam(params=controller.parameters(), lr=args.controller_lr, betas=(0.0, 0.999), eps=1e-3) # https://github.com/melodyguan/enas/blob/master/src/utils.py#L213 shared_cnn_optimizer = torch.optim.SGD(params=shared_cnn.parameters(), lr=args.child_lr_max, momentum=0.9, nesterov=True, weight_decay=args.child_l2_reg) # https://github.com/melodyguan/enas/blob/master/src/utils.py#L154 shared_cnn_scheduler = CosineAnnealingLR(optimizer=shared_cnn_optimizer, T_max=args.child_lr_T, eta_min=args.child_lr_min) if args.resume: if os.path.isfile(args.resume): print("Loading checkpoint '{}'".format(args.resume)) checkpoint = torch.load(args.resume) start_epoch = checkpoint['epoch'] # args = checkpoint['args'] shared_cnn.load_state_dict(checkpoint['shared_cnn_state_dict']) controller.load_state_dict(checkpoint['controller_state_dict']) shared_cnn_optimizer.load_state_dict(checkpoint['shared_cnn_optimizer']) controller_optimizer.load_state_dict(checkpoint['controller_optimizer']) shared_cnn_scheduler.optimizer = shared_cnn_optimizer # Not sure if this actually works print("Loaded checkpoint '{}' (epoch {})" .format(args.resume, checkpoint['epoch'])) else: raise ValueError("No checkpoint found at '{}'".format(args.resume)) else: start_epoch = 0 if not args.fixed_arc: train_enas(start_epoch, controller, shared_cnn, data_loaders, shared_cnn_optimizer, controller_optimizer, shared_cnn_scheduler) else: assert args.resume != '', 'A pretrained model should be used when training a fixed architecture.' train_fixed(start_epoch, controller, shared_cnn, data_loaders)