def train(self):
        lookahead = train_dataset.lookahead
        val_lookahead = val_dataset.lookahead
        t_val = torch.linspace(0, val_lookahead * dt, val_lookahead + 1)

        train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=self.shuffle, drop_last=True)
        val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=self.shuffle, drop_last=True)

        val_losses = []
        train_losses = []
        pre_val_loss = 1000000

        assert(n_iterations == int(len(self.train_dataset) / self.batch_size))
        logging.info("\nSTARTING TO TRAIN MODEL | EPOCHS : {} | lr: {} | batchsize: {} | lookahead: {}"
                     .format(self.epochs, self.lr, self.batch_size, lookahead))
        logging.info("                        | iterations: {} | #trainable parameters: {} \n"
                     .format(n_iterations, get_num_trainable_params(params)))

        pre_train_time = time.time()
        now = pre_train_time
        for epoch in range(self.epochs):

            for n, (batch_X0, batch_X) in enumerate(train_dataloader):
                self.model.train()
                self.optimizer.zero_grad()
                batch_X0 = batch_X0.view(self.batch_size, self.data_dim)
                X_pred = odeint(f, batch_X0, t).permute(1, 0, 2)
                loss = torch.mean(torch.abs(X_pred - batch_X) ** 2)
                loss.backward()
                self.optimizer.step()
                if self.train_on_one_batch:
                    break

            train_losses.append(float(loss.detach()))
            self.model.eval()
            val_X0, val_X = next(iter(val_dataloader))
            val_X0 = val_X0.view(self.batch_size, self.data_dim)
            X_val_pred = odeint(self.model, val_X0, t_val).permute(1, 0, 2)
            val_loss = torch.mean(torch.abs(X_val_pred - val_X) ** 2)
            val_losses.append(float(val_loss))

            # scheduler.step(val_loss)

            if epoch % 10 == 0:
                time_for_epochs = int(time.time() - now)
                logging.info("EPOCH {} finished with training loss: {} | validation loss: {} | lr: {} | delta time: {}s"
                             .format(epoch, loss, val_loss, get_lr(self.optimizer), time_for_epochs))
                save_models(self.model_dir, self.model)
                save_optimizer(self.model_dir, self.optimizer)
                # if val_loss > pre_val_loss and EPOCH % 30 == 0:
                #    logging.info("\n STOPPING TRAINING EARLY BECAUSE VAL.LOSS STOPPED IMPROVING!\n")
                #    break
                now = time.time()
            pre_val_loss = val_loss

        post_train_time = time.time()
        logging.info('\nTRAINING FINISHED after {} seconds'.format(int(post_train_time - pre_train_time)))
        plt.plot(np.log(train_losses), label='train loss')
        plt.plot(np.log(val_losses), label='validation loss')
        plt.legend(), plt.savefig(figures_dir + '/losses.png'), plt.show()
 def save_model(self,path = var_save_path, suffix = None):
     if suffix is None:
         suffix = self.model_name
     save_list = [self.s_enc, self.z_enc, self.sz_dec, self.z_adv]
     save_list[0].m_name = 's_enc';         save_list[1].m_name = 'z_enc';
     save_list[2].m_name = 'sz_dec';        save_list[3].m_name = 'z_adv';
     utils.save_models(save_list,path, mode='param', mode_param = suffix)
def main():
    args = parse_arguments()
    n_vocab = params.n_vocab
    n_layer = params.n_layer
    n_hidden = params.n_hidden
    n_embed = params.n_embed
    n_batch = args.n_batch
    temperature = params.temperature
    train_path = params.train_path
    assert torch.cuda.is_available()

    print("loading_data...")
    # 训练时加载处理好的词典(如果有的话)
    if os.path.exists("vocab.json"):
        vocab = Vocabulary()
        with open('vocab.json', 'r') as fp:
            vocab.stoi = json.load(fp)

        for key, value in vocab.stoi.items():
            vocab.itos.append(key)
    else:
        vocab = build_vocab(train_path, n_vocab)
        # save vocab
        with open('vocab.json', 'w') as fp:
            json.dump(vocab.stoi, fp)

    train_X, train_y, train_K = load_data(train_path, vocab)
    train_loader = get_data_loader(train_X, train_y, train_K, n_batch)
    print("successfully loaded")

    encoder = Encoder(n_vocab, n_embed, n_hidden, n_layer, vocab).cuda()
    Kencoder = KnowledgeEncoder(n_vocab, n_embed, n_hidden, n_layer,
                                vocab).cuda()
    manager = Manager(n_hidden, n_vocab, temperature).cuda()
    decoder = Decoder(n_vocab, n_embed, n_hidden, n_layer, vocab).cuda()

    if args.restore:
        encoder = init_model(encoder, restore=params.encoder_restore)
        Kencoder = init_model(Kencoder, restore=params.Kencoder_restore)
        manager = init_model(manager, restore=params.manager_restore)
        decoder = init_model(decoder, restore=params.decoder_restore)

    # ToDo:目前的代码所有的embedding都是独立的,可以参考transformer源码使用直接赋值的方法共享参数:
    #if emb_src_trg_weight_sharing:
    #   self.encoder.src_word_emb.weight = self.decoder.trg_word_emb.weight

    model = [encoder, Kencoder, manager, decoder]
    parameters = list(encoder.parameters()) + list(Kencoder.parameters()) + \
                 list(manager.parameters()) + list(decoder.parameters())
    optimizer = optim.Adam(parameters, lr=args.lr)

    # pre_train knowledge manager
    print("start pre-training")
    pre_train(model, optimizer, train_loader, args)
    print("start training")
    train(model, optimizer, train_loader, args)

    # save final model
    save_models(model, params.all_restore)
Exemple #4
0
    def switch_evaluation_to_training(engine):
        if needs_save:
            save_logs('val', k, n_splits, evaluator, trainer.state.epoch, trainer.state.iteration,
                      config, output_dir_path)

            if trainer.state.epoch % 100 == 0:
                save_models(model, optimizer, k, n_splits, trainer.state.epoch, trainer.state.iteration,
                            config, output_dir_path)
 def train(self, d_model_A, d_model_B, g_model_AtoB, g_model_BtoA,
           c_model_AtoB, c_model_BtoA, dataset):
     '''  tarining step for cyclegan models'''
     # define properties of the training run
     n_epochs, n_batch, = 50, 1
     # determine the output square shape of the discriminator
     n_patch = d_model_A.output_shape[1]
     # unpack dataset
     trainA, trainB = dataset
     # prepare image pool for fakes
     poolA, poolB = list(), list()
     # calculate the number of batches per training epoch
     bat_per_epo = int(len(trainA) / n_batch)
     # calculate the number of training iterations
     n_steps = bat_per_epo * n_epochs
     # manually enumerate epochs
     for i in range(n_steps):
         # select a batch of real samples
         X_realA, y_realA = generate_real_samples(trainA, n_batch, n_patch)
         X_realB, y_realB = generate_real_samples(trainB, n_batch, n_patch)
         # generate a batch of fake samples
         X_fakeA, y_fakeA = generate_fake_samples(g_model_BtoA, X_realB,
                                                  n_patch)
         X_fakeB, y_fakeB = generate_fake_samples(g_model_AtoB, X_realA,
                                                  n_patch)
         # update fakes from pool
         X_fakeA = update_image_pool(poolA, X_fakeA)
         X_fakeB = update_image_pool(poolB, X_fakeB)
         # update generator B->A via adversarial and cycle los
         g_loss2, _, _, _, _ = c_model_BtoA.train_on_batch(
             [X_realB, X_realA], [y_realA, X_realA, X_realB, X_realA])
         # update discriminator for A -> [real/fake]
         dA_loss1 = d_model_A.train_on_batch(X_realA, y_realA)
         dA_loss2 = d_model_A.train_on_batch(X_fakeA, y_fakeA)
         # update generator A->B via adversarial and cycle loss
         g_loss1, _, _, _, _ = c_model_AtoB.train_on_batch(
             [X_realA, X_realB], [y_realB, X_realB, X_realA, X_realB])
         # update discriminator for B -> [real/fake]
         dB_loss1 = d_model_B.train_on_batch(X_realB, y_realB)
         dB_loss2 = d_model_B.train_on_batch(X_fakeB, y_fakeB)
         # summarize performance
         print('>%d, dA[%.3f,%.3f] dB[%.3f,%.3f] g[%.3f,%.3f]' %
               (i + 1, dA_loss1, dA_loss2, dB_loss1, dB_loss2, g_loss1,
                g_loss2))
         # evaluate the model performance every so often
         if (i + 1) % (bat_per_epo * 1) == 0:
             # plot A->B translation
             summarize_performance(i, g_model_AtoB, trainA, 'AtoB')
             # plot B->A translation
             summarize_performance(i, g_model_BtoA, trainB, 'BtoA')
         if (i + 1) % (bat_per_epo * 5) == 0:
             # save the models
             save_models(i, g_model_AtoB, g_model_BtoA)
Exemple #6
0
def main():
    args = parse_arguments()
    n_vocab = params.n_vocab
    n_layer = params.n_layer
    n_hidden = params.n_hidden
    n_embed = params.n_embed
    n_batch = args.n_batch
    temperature = params.temperature
    train_path = params.train_path
    assert torch.cuda.is_available()

    print("loading_data...")
    vocab = build_vocab(train_path, n_vocab)

    # save vocab
    with open('vocab.json', 'w') as fp:
        json.dump(vocab.stoi, fp)

    train_X, train_y, train_K = load_data(train_path, vocab)
    train_loader = get_data_loader(train_X, train_y, train_K, n_batch)
    print("successfully loaded")

    encoder = Encoder(n_vocab, n_embed, n_hidden, n_layer, vocab).cuda()
    Kencoder = KnowledgeEncoder(n_vocab, n_embed, n_hidden, n_layer,
                                vocab).cuda()
    manager = Manager(n_hidden, n_vocab, temperature).cuda()
    decoder = Decoder(n_vocab, n_embed, n_hidden, n_layer, vocab).cuda()

    if args.restore:
        encoder = init_model(encoder, restore=params.encoder_restore)
        Kencoder = init_model(Kencoder, restore=params.Kencoder_restore)
        manager = init_model(manager, restore=params.manager_restore)
        decoder = init_model(decoder, restore=params.decoder_restore)

    model = [encoder, Kencoder, manager, decoder]
    parameters = list(encoder.parameters()) + list(Kencoder.parameters()) + \
                 list(manager.parameters()) + list(decoder.parameters())
    optimizer = optim.Adam(parameters, lr=args.lr)

    # pre_train knowledge manager
    print("start pre-training")
    pre_train(model, optimizer, train_loader, args)
    print("start training")
    train(model, optimizer, train_loader, args)

    # save final model
    save_models(model, params.all_restore)
Exemple #7
0
def main():
    env = airsim_env.windENV()
    memory = ReplayBuffer()

    q, q_target = QNet(), QNet()
    q_target.load_state_dict(q.state_dict())
    mu, mu_target = MuNet(), MuNet()
    mu_target.load_state_dict(mu.state_dict())

    score = 0.0
    print_interval = 20

    mu_optimizer = optim.Adam(mu.parameters(), lr=lr_mu)
    q_optimizer = optim.Adam(q.parameters(), lr=lr_q)

    for n_epi in range(10000):
        s = env.reset()
        done = False

        while not done:
            a = mu(torch.from_numpy(s).float())
            a = a.detach().numpy()
            a = (a + np.random.normal(0, 0.1, size=4)).clip(-0.6, 0.4)
            s_prime, r, done, info = env.step(a)
            memory.put((s, a, r / 100.0, s_prime, done))
            score += r
            s = s_prime

            if memory.size() > 1000:
                train(mu, mu_target, q, q_target, memory, q_optimizer,
                      mu_optimizer)
                soft_update(mu, mu_target)
                soft_update(q, q_target)

        if n_epi % print_interval == 0 and n_epi != 0:
            print("# of episode :{}, avg score : {:.1f}".format(
                n_epi, score / print_interval))
            score = 0.0

        if n_epi % 1000 == 0 and n_epi != 0:
            utils.save_models(mu, q, n_epi)
Exemple #8
0
def pre_train(model, optimizer, train_loader, args):
    encoder, Kencoder, manager, decoder = [*model]
    encoder.train(), Kencoder.train(), manager.train(), decoder.train()
    parameters = list(encoder.parameters()) + list(Kencoder.parameters()) + \
                 list(manager.parameters()) + list(decoder.parameters())
    NLLLoss = nn.NLLLoss(reduction='mean', ignore_index=params.PAD)
    for epoch in range(args.pre_epoch):
        b_loss = 0
        for step, (src_X, src_y, src_K, _) in enumerate(train_loader):
            src_X = src_X.cuda()
            src_y = src_y.cuda()
            src_K = src_K.cuda()
            mask = (src_X != 0).long()

            optimizer.zero_grad()
            _, x = encoder(src_X, mask)
            n_batch = src_y.size(0)
            n_vocab = params.n_vocab
			
            CLS_tokens = torch.LongTensor([params.CLS] * n_batch).unsqueeze(1).cuda()
            SEP_tokens = torch.LongTensor([params.SEP] * n_batch).unsqueeze(1).cuda()
            src_y_ = torch.cat((CLS_tokens, src_y[:, 1:], SEP_tokens), dim=-1)
            y = Kencoder(src_y_)
            K = Kencoder(src_K)

            seq_len = src_y.size(1) - 1
            _, _, _, k_logits = manager(x, y, K) # k_logits: [n_batch, n_vocab]
            k_logits = k_logits.repeat(seq_len, 1, 1).transpose(0, 1).contiguous().view(-1, n_vocab)
            bow_loss = NLLLoss(k_logits, src_y[:, 1:].contiguous().view(-1))
            bow_loss.backward()
            clip_grad_norm_(parameters, args.grad_clip)
            optimizer.step()
            b_loss += bow_loss.item()
            if (step + 1) % 10 == 0:
                b_loss /= 10
                print("Epoch [%.1d/%.1d] Step [%.4d/%.4d]: bow_loss=%.4f" % (epoch + 1, args.pre_epoch,
                                                                             step + 1, len(train_loader),
                                                                             b_loss))
                b_loss = 0
        # save models
        save_models(model, params.all_restore)
Exemple #9
0
def pre_train(model, optimizer, train_loader, args):
    encoder, Kencoder, manager, decoder = [*model]
    encoder.train(), Kencoder.train(), manager.train(), decoder.train()
    parameters = list(encoder.parameters()) + list(Kencoder.parameters()) + \
                 list(manager.parameters())
    NLLLoss = nn.NLLLoss(reduction='mean', ignore_index=params.PAD)

    for epoch in range(args.pre_epoch):
        epoch_start_time =time.time()
        b_loss = 0
        print('Start preTraining epoch %d ...'%(epoch))
        for step, (src_X, src_y, src_K, _) in enumerate(train_loader):
            # if step>300:
            #     break
            src_X = src_X.cuda()
            src_y = src_y.cuda()
            src_K = src_K.cuda()

            optimizer.zero_grad()
            _, _, x = encoder(src_X)
            y = Kencoder(src_y)
            K = Kencoder(src_K)

            n_vocab = params.n_vocab
            seq_len = src_y.size(1) - 1
            _, _, _, k_logits = manager(x, y, K) # k_logits: [n_batch, n_vocab]
            k_logits = k_logits.repeat(seq_len, 1, 1).transpose(0, 1).contiguous().view(-1, n_vocab)
            bow_loss = NLLLoss(k_logits, src_y[:, 1:].contiguous().view(-1))
            bow_loss.backward()
            clip_grad_norm_(parameters, args.grad_clip)
            optimizer.step()
            b_loss += bow_loss.item()
            if (step + 1) % 10 == 0:
                b_loss /= 10
                print("Epoch [%.1d/%.1d] Step [%.4d/%.4d]: bow_loss=%.4f, epoch_time:%.2f s" % (epoch + 1, args.pre_epoch,
                                                                             step + 1, len(train_loader),
                                                                             b_loss,time.time()-epoch_start_time))
                b_loss = 0
        # save models
        save_models(model, params.all_restore,0-epoch-1,b_loss)
def main(args):
    # hyperparameters
    batch_size = args.batch_size
    num_workers = 1

    # Image Preprocessing
    transform = transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
    ])

    # load COCOs dataset
    IMAGES_PATH = 'data/train2014'
    CAPTION_FILE_PATH = 'data/annotations/captions_train2014.json'

    vocab = load_vocab()
    train_loader = get_coco_data_loader(path=IMAGES_PATH,
                                        json=CAPTION_FILE_PATH,
                                        vocab=vocab,
                                        transform=transform,
                                        batch_size=batch_size,
                                        shuffle=True,
                                        num_workers=num_workers)

    IMAGES_PATH = 'data/val2014'
    CAPTION_FILE_PATH = 'data/annotations/captions_val2014.json'
    val_loader = get_coco_data_loader(path=IMAGES_PATH,
                                      json=CAPTION_FILE_PATH,
                                      vocab=vocab,
                                      transform=transform,
                                      batch_size=batch_size,
                                      shuffle=True,
                                      num_workers=num_workers)

    losses_val = []
    losses_train = []

    # Build the models
    ngpu = 1
    initial_step = initial_epoch = 0
    embed_size = args.embed_size
    num_hiddens = args.num_hidden
    learning_rate = 5e-4
    num_epochs = 2
    log_step = args.log_step
    save_step = 500
    checkpoint_dir = args.checkpoint_dir

    encoder = CNNEncoder()
    decoder = DecoderRNN(embed_size, num_hiddens, len(vocab))

    # Loss
    criterion = nn.CrossEntropyLoss()

    if args.checkpoint_file:
        encoder_state_dict, decoder_state_dict, optimizer, *meta = utils.load_models(
            args.checkpoint_file, args.sample)
        initial_step, initial_epoch, losses_train, losses_val = meta
        encoder.load_state_dict(encoder_state_dict)
        decoder.load_state_dict(decoder_state_dict)
    else:
        params = list(decoder.parameters()) + list(
            encoder.batchnorm.parameters())
        optimizer = torch.optim.Adam(params, lr=learning_rate)

    if torch.cuda.is_available():
        encoder.cuda()
        decoder.cuda()

    if args.sample:
        return utils.sample(encoder, decoder, vocab, val_loader)

    # Train the Models
    total_step = len(train_loader)
    try:
        for epoch in range(initial_epoch, num_epochs):

            for step, (images, captions,
                       lengths) in enumerate(train_loader, start=initial_step):

                # Set mini-batch dataset
                images = utils.to_var(images, volatile=True)
                captions = utils.to_var(captions)
                targets = pack_padded_sequence(captions,
                                               lengths,
                                               batch_first=True)[0]
                # Forward, Backward and Optimize
                decoder.zero_grad()
                encoder.zero_grad()
                if ngpu > 1:
                    # run on multiple GPU
                    features = nn.parallel.data_parallel(
                        encoder, images, range(ngpu))
                    outputs, alphas = nn.parallel.data_parallel(
                        decoder, features, range(ngpu))
                else:
                    # run on single GPU
                    features = encoder(images)
                    outputs, alphas = decoder(features, captions, lengths)

                train_loss = criterion(outputs, targets.cpu())
                train_loss += ((1. - alphas.sum(dim=1))**2).mean()
                losses_train.append(train_loss.data)
                train_loss.backward()
                optimizer.step()

                print('Epoch: {} - Step: {} - Train Loss: {}'.format(
                    epoch, step, losses_train[-1]))
                # Run validation set and predict
                if step % log_step == 404:
                    encoder.batchnorm.eval()
                    # run validation set
                    batch_loss_val = []
                    for val_step, (images, captions,
                                   lengths) in enumerate(val_loader):
                        images = utils.to_var(images, volatile=True)
                        captions = utils.to_var(captions, volatile=True)

                        targets = pack_padded_sequence(captions,
                                                       lengths,
                                                       batch_first=True)[0]
                        features = encoder(images)
                        outputs, alphas = decoder(features, captions, lengths)
                        val_loss = criterion(outputs, targets.cpu())
                        val_loss += ((1. - alphas.sum(dim=1))**2).mean()
                        batch_loss_val.append(val_loss.data)
                        if val_step % 50 == 0:
                            print('Epoch: {} - Step: {} - Mini Eval Loss: {}'.
                                  format(epoch, val_step, val_loss))
                            sampled_ids = decoder.sample(features)
                            sampled_ids = sampled_ids.cpu().data.numpy()[0]
                            sentence = utils.convert_back_to_text(
                                sampled_ids, vocab)
                            print('Sample:', sentence)

                            true_ids = captions.cpu().data.numpy()[0]
                            sentence = utils.convert_back_to_text(
                                true_ids, vocab)
                            print('Target:', sentence)

                    losses_val.append(np.mean(batch_loss_val))
                    # predict

                    print('Epoch: {} - Step: {} - Eval Loss: {}'.format(
                        epoch, step, losses_val[-1]))
                    encoder.batchnorm.train()

                # Save the models
                if (step + 1) % save_step == 0:
                    utils.save_models(encoder, decoder, optimizer, step, epoch,
                                      losses_train, losses_val, checkpoint_dir)
                    utils.dump_losses(
                        losses_train, losses_val,
                        os.path.join(checkpoint_dir, 'losses.pkl'))

    except KeyboardInterrupt:
        pass
    finally:
        # Do final save
        utils.save_models(encoder, decoder, optimizer, step, epoch,
                          losses_train, losses_val, checkpoint_dir)
        utils.dump_losses(losses_train, losses_val,
                          os.path.join(checkpoint_dir, 'losses.pkl'))
def train(model, optimizer, train_loader, args):
    encoder, Kencoder, manager, decoder = [*model]
    encoder.train(), Kencoder.train(), manager.train(), decoder.train()
    parameters = list(encoder.parameters()) + list(Kencoder.parameters()) + \
                 list(manager.parameters()) + list(decoder.parameters())
    NLLLoss = nn.NLLLoss(reduction='mean', ignore_index=params.PAD)
    KLDLoss = nn.KLDivLoss(reduction='batchmean')

    for epoch in range(args.n_epoch):
        b_loss = 0
        k_loss = 0
        n_loss = 0
        t_loss = 0
        for step, (src_X, src_y, src_K, tgt_y) in enumerate(train_loader):
            src_X = src_X.cuda()
            src_y = src_y.cuda()
            src_K = src_K.cuda()
            tgt_y = tgt_y.cuda()

            optimizer.zero_grad()
            encoder_outputs, hidden, x = encoder(src_X)
            encoder_mask = (src_X == 0)[:, :encoder_outputs.size(0)].unsqueeze(1).byte()
            y = Kencoder(src_y)
            K = Kencoder(src_K)
            prior, posterior, k_i, k_logits = manager(x, y, K)
            kldiv_loss = KLDLoss(prior, posterior.detach())

            n_vocab = params.n_vocab
            seq_len = src_y.size(1) - 1
            k_logits = k_logits.repeat(seq_len, 1, 1).transpose(0, 1).contiguous().view(-1, n_vocab)
            bow_loss = NLLLoss(k_logits, src_y[:, 1:].contiguous().view(-1))

            n_batch = src_X.size(0)
            max_len = tgt_y.size(1)

            outputs = torch.zeros(max_len, n_batch, n_vocab).cuda()
            hidden = hidden[params.n_layer:]
            output = torch.LongTensor([params.SOS] * n_batch).cuda()  # [n_batch]
            for t in range(max_len):
                output, hidden, attn_weights = decoder(output, k_i, hidden, encoder_outputs, encoder_mask)
                outputs[t] = output
                is_teacher = random.random() < args.tfr  # teacher forcing ratio
                top1 = output.data.max(1)[1]
                output = tgt_y[:, t] if is_teacher else top1

            outputs = outputs.transpose(0, 1).contiguous()
            nll_loss = NLLLoss(outputs.view(-1, n_vocab),
                               tgt_y.contiguous().view(-1))

            loss = kldiv_loss + nll_loss + bow_loss
            loss.backward()
            clip_grad_norm_(parameters, args.grad_clip)
            optimizer.step()
            b_loss += bow_loss.item()
            k_loss += kldiv_loss.item()
            n_loss += nll_loss.item()
            t_loss += loss.item()

            if (step + 1) % 50 == 0:
                k_loss /= 50
                n_loss /= 50
                b_loss /= 50
                t_loss /= 50
                print("Epoch [%.2d/%.2d] Step [%.4d/%.4d]: total_loss=%.4f kldiv_loss=%.4f bow_loss=%.4f nll_loss=%.4f"
                      % (epoch + 1, args.n_epoch,
                         step + 1, len(train_loader),
                         t_loss, k_loss, b_loss, n_loss))
                k_loss = 0
                n_loss = 0
                b_loss = 0
                t_loss = 0
        # save models
        save_models(model, params.all_restore)
def main():
    """Run NFQ."""
    # Setup hyperparameters
    parser = configargparse.ArgParser()
    parser.add("-c", "--config", required=True, is_config_file=True)
    parser.add("--EPOCH", type=int)
    parser.add("--TRAIN_ENV_MAX_STEPS", type=int)
    parser.add("--EVAL_ENV_MAX_STEPS", type=int)
    parser.add("--DISCOUNT", type=float)
    parser.add("--INIT_EXPERIENCE", type=int)
    parser.add("--INCREMENT_EXPERIENCE", action="store_true")
    parser.add("--HINT_TO_GOAL", action="store_true")
    parser.add("--RANDOM_SEED", type=int)
    parser.add("--TRAIN_RENDER", action="store_true")
    parser.add("--EVAL_RENDER", action="store_true")
    parser.add("--SAVE_PATH", type=str, default="")
    parser.add("--LOAD_PATH", type=str, default="")
    parser.add("--USE_TENSORBOARD", action="store_true")
    parser.add("--USE_WANDB", action="store_true")
    CONFIG = parser.parse_args()
    if not hasattr(CONFIG, "INCREMENT_EXPERIENCE"):
        CONFIG.INCREMENT_EXPERIENCE = False
    if not hasattr(CONFIG, "HINT_TO_GOAL"):
        CONFIG.HINT_TO_GOAL = False
    if not hasattr(CONFIG, "TRAIN_RENDER"):
        CONFIG.TRAIN_RENDER = False
    if not hasattr(CONFIG, "EVAL_RENDER"):
        CONFIG.EVAL_RENDER = False
    if not hasattr(CONFIG, "USE_TENSORBOARD"):
        CONFIG.USE_TENSORBOARD = False
    if not hasattr(CONFIG, "USE_WANDB"):
        CONFIG.USE_WANDB = False

    print()
    print(
        "+--------------------------------+--------------------------------+")
    print(
        "| Hyperparameters                | Value                          |")
    print(
        "+--------------------------------+--------------------------------+")
    for arg in vars(CONFIG):
        print("| {:30} | {:<30} |".format(
            arg,
            getattr(CONFIG, arg) if getattr(CONFIG, arg) is not None else ""))
    print(
        "+--------------------------------+--------------------------------+")
    print()

    # Log to File, Console, TensorBoard, W&B
    logger = get_logger()

    if CONFIG.USE_TENSORBOARD:
        from torch.utils.tensorboard import SummaryWriter

        writer = SummaryWriter(log_dir="tensorboard_logs")
    if CONFIG.USE_WANDB:
        import wandb

        wandb.init(project="implementations-nfq", config=CONFIG)

    # Setup environment
    train_env = CartPoleRegulatorEnv(mode="train")
    eval_env = CartPoleRegulatorEnv(mode="eval")

    # Fix random seeds
    if CONFIG.RANDOM_SEED is not None:
        make_reproducible(CONFIG.RANDOM_SEED, use_numpy=True, use_torch=True)
        train_env.seed(CONFIG.RANDOM_SEED)
        eval_env.seed(CONFIG.RANDOM_SEED)
    else:
        logger.warning(
            "Running without a random seed: this run is NOT reproducible.")

    # Setup agent
    nfq_net = NFQNetwork()
    optimizer = optim.Rprop(nfq_net.parameters())
    nfq_agent = NFQAgent(nfq_net, optimizer)

    # Load trained agent
    if CONFIG.LOAD_PATH:
        load_models(CONFIG.LOAD_PATH, nfq_net=nfq_net, optimizer=optimizer)

    # NFQ Main loop
    # A set of transition samples denoted as D
    all_rollouts = []
    total_cost = 0
    if CONFIG.INIT_EXPERIENCE:
        for _ in range(CONFIG.INIT_EXPERIENCE):
            rollout, episode_cost = train_env.generate_rollout(
                None, render=CONFIG.TRAIN_RENDER)
            all_rollouts.extend(rollout)
            total_cost += episode_cost
    for epoch in range(CONFIG.EPOCH + 1):
        # Variant 1: Incermentally add transitions (Section 3.4)
        # TODO(seungjaeryanlee): Done before or after training?
        if CONFIG.INCREMENT_EXPERIENCE:
            new_rollout, episode_cost = train_env.generate_rollout(
                nfq_agent.get_best_action, render=CONFIG.TRAIN_RENDER)
            all_rollouts.extend(new_rollout)
            total_cost += episode_cost

        state_action_b, target_q_values = nfq_agent.generate_pattern_set(
            all_rollouts)

        # Variant 2: Clamp function to zero in goal region
        # TODO(seungjaeryanlee): Since this is a regulator setting, should it
        #                        not be clamped to zero?
        if CONFIG.HINT_TO_GOAL:
            goal_state_action_b, goal_target_q_values = train_env.get_goal_pattern_set(
            )
            goal_state_action_b = torch.FloatTensor(goal_state_action_b)
            goal_target_q_values = torch.FloatTensor(goal_target_q_values)
            state_action_b = torch.cat([state_action_b, goal_state_action_b],
                                       dim=0)
            target_q_values = torch.cat(
                [target_q_values, goal_target_q_values], dim=0)

        loss = nfq_agent.train((state_action_b, target_q_values))

        # TODO(seungjaeryanlee): Evaluation should be done with 3000 episodes
        eval_episode_length, eval_success, eval_episode_cost = nfq_agent.evaluate(
            eval_env, CONFIG.EVAL_RENDER)

        if CONFIG.INCREMENT_EXPERIENCE:
            logger.info(
                "Epoch {:4d} | Train {:3d} / {:4.2f} | Eval {:4d} / {:5.2f} | Train Loss {:.4f}"
                .format(  # noqa: B950
                    epoch,
                    len(new_rollout),
                    episode_cost,
                    eval_episode_length,
                    eval_episode_cost,
                    loss,
                ))
            if CONFIG.USE_TENSORBOARD:
                writer.add_scalar("train/episode_length", len(new_rollout),
                                  epoch)
                writer.add_scalar("train/episode_cost", episode_cost, epoch)
                writer.add_scalar("train/loss", loss, epoch)
                writer.add_scalar("eval/episode_length", eval_episode_length,
                                  epoch)
                writer.add_scalar("eval/episode_cost", eval_episode_cost,
                                  epoch)
            if CONFIG.USE_WANDB:
                wandb.log({"Train Episode Length": len(new_rollout)},
                          step=epoch)
                wandb.log({"Train Episode Cost": episode_cost}, step=epoch)
                wandb.log({"Train Loss": loss}, step=epoch)
                wandb.log({"Evaluation Episode Length": eval_episode_length},
                          step=epoch)
                wandb.log({"Evaluation Episode Cost": eval_episode_cost},
                          step=epoch)
        else:
            logger.info(
                "Epoch {:4d} | Eval {:4d} / {:5.2f} | Train Loss {:.4f}".
                format(epoch, eval_episode_length, eval_episode_cost, loss))
            if CONFIG.USE_TENSORBOARD:
                writer.add_scalar("train/loss", loss, epoch)
                writer.add_scalar("eval/episode_length", eval_episode_length,
                                  epoch)
                writer.add_scalar("eval/episode_cost", eval_episode_cost,
                                  epoch)
            if CONFIG.USE_WANDB:
                wandb.log({"Train Loss": loss}, step=epoch)
                wandb.log({"Evaluation Episode Length": eval_episode_length},
                          step=epoch)
                wandb.log({"Evaluation Episode Cost": eval_episode_cost},
                          step=epoch)

        if eval_success:
            logger.info(
                "Epoch {:4d} | Total Cycles {:6d} | Total Cost {:4.2f}".format(
                    epoch, len(all_rollouts), total_cost))
            if CONFIG.USE_TENSORBOARD:
                writer.add_scalar("summary/total_cycles", len(all_rollouts),
                                  epoch)
                writer.add_scalar("summary/total_cost", total_cost, epoch)
            if CONFIG.USE_WANDB:
                wandb.log({"Total Cycles": len(all_rollouts)}, step=epoch)
                wandb.log({"Total Cost": total_cost}, step=epoch)
            break

    # Save trained agent
    if CONFIG.SAVE_PATH:
        save_models(CONFIG.SAVE_PATH, nfq_net=nfq_net, optimizer=optimizer)

    train_env.close()
    eval_env.close()
def get_bssevals(dr, arguments):
    loader1, loader2, loader_mix = ut.preprocess_timit_files(arguments, dr=dr)

    exp_info = '_'.join([
        arguments.tr_method, arguments.test_method, arguments.data,
        arguments.dataname, arguments.input_type, arguments.optimizer,
        'feat_match',
        str(arguments.feat_match), 'K',
        str(arguments.K), 'Kdisc',
        str(arguments.Kdisc), 'L1',
        str(arguments.L1), 'smooth_estimate',
        str(arguments.smooth_source_estimates), 'nfft',
        str(arguments.n_fft)
    ])
    arguments.exp_info = exp_info

    ngpu = 1
    L1 = arguments.L1
    L2 = arguments.L2
    K = arguments.K
    Kdisc = arguments.Kdisc
    smooth_output = arguments.smooth_output
    tr_method = arguments.tr_method
    loss = 'Poisson'
    alpha_range = arguments.alpha_range

    if tr_method == 'VAE':
        generator1 = VAE(ngpu, K=K, L1=L1, L2=L2, arguments=arguments)
        generator2 = VAE(ngpu, K=K, L1=L1, L2=L2, arguments=arguments)
    else:
        generator1 = netG(ngpu, K=K, L1=L1, L2=L2, arguments=arguments)
        generator2 = netG(ngpu, K=K, L1=L1, L2=L2, arguments=arguments)

    discriminator1 = netD(ngpu, K=Kdisc, L=L2, arguments=arguments)
    discriminator2 = netD(ngpu, K=Kdisc, L=L2, arguments=arguments)

    if arguments.cuda:
        generator1.cuda()
        discriminator1.cuda()

        generator2.cuda()
        discriminator2.cuda()

    # Train the generative models for the sources

    if arguments.load_models:
        modelfldr = 'model_parameters'
        generator1.load_state_dict(
            torch.load(
                os.path.join(modelfldr, 'generator0_' + exp_info + '.trc')))
        generator2.load_state_dict(
            torch.load(
                os.path.join(modelfldr, 'generator1_' + exp_info + '.trc')))

        discriminator1.load_state_dict(
            torch.load(
                os.path.join(modelfldr,
                             'discriminator0_' + exp_info + '.trc')))
        discriminator2.load_state_dict(
            torch.load(
                os.path.join(modelfldr,
                             'discriminator1_' + exp_info + '.trc')))
    else:
        EP = arguments.EP_train
        if tr_method == 'adversarial':
            criterion = nn.BCELoss()

            adversarial_trainer(loader_mix=loader_mix,
                                train_loader=loader1,
                                generator=generator1,
                                discriminator=discriminator1,
                                EP=EP,
                                arguments=arguments,
                                criterion=criterion,
                                conditional_gen=False,
                                source_num=1)

            adversarial_trainer(loader_mix=loader_mix,
                                train_loader=loader2,
                                generator=generator2,
                                discriminator=discriminator2,
                                EP=EP,
                                arguments=arguments,
                                criterion=criterion,
                                conditional_gen=False,
                                source_num=2)

        elif tr_method == 'adversarial_wasserstein':

            adversarial_wasserstein_trainer(loader_mix=loader_mix,
                                            train_loader=loader1,
                                            generator=generator1,
                                            discriminator=discriminator1,
                                            EP=EP,
                                            arguments=arguments,
                                            conditional_gen=False,
                                            source_num=1)

            adversarial_wasserstein_trainer(loader_mix=loader_mix,
                                            train_loader=loader2,
                                            generator=generator2,
                                            discriminator=discriminator2,
                                            EP=EP,
                                            arguments=arguments,
                                            conditional_gen=False,
                                            source_num=2)

        elif tr_method == 'VAE':

            def loss_function(recon_x, x, mu, logvar):
                eps = 1e-20
                criterion = lambda lam, tar: torch.mean(-tar * torch.log(
                    lam + eps) + lam)

                BCE = criterion(recon_x, x)

                # see Appendix B from VAE paper:
                # Kingma and Welling. Auto-Encoding Variational Bayes. ICLR, 2014
                # https://arxiv.org/abs/1312.6114
                # 0.5 * sum(1 + log(sigma^2) - mu^2 - sigma^2)
                KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
                # Normalise by same number of elements as in reconstruction
                KLD /= x.size(0) * arguments.L2

                return BCE + KLD

            VAE_trainer(loader_mix=loader_mix,
                        train_loader=loader1,
                        generator=generator1,
                        EP=EP,
                        arguments=arguments,
                        criterion=loss_function,
                        conditional_gen=False)
            VAE_trainer(loader_mix=loader_mix,
                        train_loader=loader2,
                        generator=generator2,
                        EP=EP,
                        arguments=arguments,
                        criterion=loss_function,
                        conditional_gen=False)

        elif tr_method == 'ML':
            if loss == 'Euclidean':
                criterion = nn.MSELoss()
            elif loss == 'Poisson':
                eps = 1e-20
                criterion = lambda lam, tar: torch.mean(-tar * torch.log(
                    lam + eps) + lam)
            generative_trainer(loader_mix=loader_mix,
                               train_loader=loader1,
                               generator=generator1,
                               EP=EP,
                               arguments=arguments,
                               criterion=criterion,
                               conditional_gen=False)
            generative_trainer(loader_mix=loader_mix,
                               train_loader=loader2,
                               generator=generator2,
                               EP=EP,
                               arguments=arguments,
                               criterion=criterion,
                               conditional_gen=False)

        # save models
        savepath = os.path.join(os.getcwd(), 'model_parameters')
        if not os.path.exists(savepath):
            os.mkdir(savepath)

        ut.save_models([generator1, generator2],
                       [discriminator1, discriminator2], exp_info, savepath,
                       arguments)

    # Separate out the sources
    bss_evals = []
    for alpha in alpha_range:
        print('The current tradeoff parameter is {}'.format(alpha))
        bss_eval = ML_separate_audio_sources(
            generators=[generator1, generator2],
            discriminators=[discriminator1, discriminator2],
            loader_mix=loader_mix,
            EP=arguments.EP_test,
            arguments=arguments,
            conditional=False,
            tr_method=tr_method,
            loss=loss,
            alpha=float(alpha),
            exp_info=exp_info)

        bss_evals.append(bss_eval)
    return bss_evals
Exemple #14
0
def train_model(encoder_optimizer, decoder_optimizer, encoder, decoder, loss_fun, m_type, dataloader, en_lang, vi_lang, save_path, encoder_save, decoder_save, num_epochs=60, val_every = 1, train_bleu_every = 10,clip = 0.1, rm = 0.8, enc_scheduler = None, dec_scheduler = None, enc_dec_fn = encode_decode, val_fn = validation_new):
	'''
	'''
	best_score = 0
	best_bleu = 0
	loss_hist = {'train': [], 'validate': []}
	bleu_hist = {'train': [], 'validate': []}
	best_encoder_wts = None
	best_decoder_wts = None
	phases = ['train','validate']
	for epoch in range(num_epochs):
		print('Epoch: [{}/{}]'.format(epoch, num_epochs));
		log.info('Epoch: [{}/{}]'.format(epoch, num_epochs))
		for ex, phase in enumerate(phases):
			start = time.time()
			total = 0
			top1_correct = 0
			running_loss = 0
			running_total = 0
			if phase == 'train':
				encoder.train()
				decoder.train()
			else:
				encoder.eval()
				decoder.eval()

			for i, data in enumerate(dataloader[phase]):

				encoder_optimizer.zero_grad()
				decoder_optimizer.zero_grad()

				encoder_i = data[0].to(device)
				decoder_i = data[1].to(device)
				src_len = data[2].to(device)
				tar_len = data[3].to(device)
				if phase == 'validate':
					out = enc_dec_fn(encoder, decoder, encoder_i, decoder_i, src_len, tar_len, rand_num=rm, val = True)
				else:
					out = enc_dec_fn(encoder, decoder, encoder_i, decoder_i, src_len, tar_len, rand_num=rm, val = False)
				N = decoder_i.size(0)
				loss = loss_fun(out.float(), decoder_i.long())
				running_loss += loss.item() * N

				total += N
				if phase == 'train':
					loss.backward()
					torch.nn.utils.clip_grad_norm_(encoder.parameters(), clip)
					torch.nn.utils.clip_grad_norm_(decoder.parameters(), clip)
					encoder_optimizer.step()
					decoder_optimizer.step()

			epoch_loss = running_loss / total
			loss_hist[phase].append(epoch_loss)
			print("epoch {} {} loss = {}, time = {}".format(epoch, phase, epoch_loss, time.time() - start))
			log.info("epoch {} {} loss = {}, time = {}".format(epoch, phase, epoch_loss, time.time() - start))


		if (enc_scheduler is not None) and (dec_scheduler is not None):
			enc_scheduler.step(loss_hist['train'][-1])
			dec_scheduler.step(loss_hist['train'][-1])

		if epoch%val_every == 0:
			val_bleu_score, _, _ , _ = val_fn(encoder, decoder, dataloader['validate'], en_lang, vi_lang, m_type, verbose=False, replace_unk=True)
			bleu_hist['validate'].append(val_bleu_score)
			print("validation BLEU = {}".format(val_bleu_score))
			log.info("validation BLEU = {}".format(val_bleu_score))
			if val_bleu_score > best_bleu:
				best_bleu = val_bleu_score
				best_encoder_wts = encoder.state_dict()
				best_decoder_wts = decoder.state_dict()
				# save best model
				utils.save_models(best_encoder_wts, save_path, encoder_save)
				utils.save_models(best_decoder_wts, save_path, decoder_save)
		print('='*50)
	encoder.load_state_dict(best_encoder_wts)
	decoder.load_state_dict(best_decoder_wts)
	print("Training completed. Best BLEU is {}".format(best_bleu))
	return encoder, decoder, loss_hist, bleu_hist
Exemple #15
0
def nested_cv(params):
    
    # The number of validation split
    cv_num = params['cv_num']
    # The number of test split
    cv_num_test = params['cv_num_test']
    # Data and labels
    data, hc_ad, site_id_, split_ref_, ref = prepare_data(params['source_dir'])
    
    # Numpy array for ML models' performance indices
    measurements_transfer = np.zeros(shape=[cv_num_test, 5])
    measurements_classifier = np.zeros(shape=[cv_num_test, 5])
    measurements_svm = np.zeros(shape=[cv_num_test, 5])
    measurements_rf = np.zeros(shape=[cv_num_test, 5])

    # List of accuracy for final output
    accs_transfer = []
    accs_classifier = []
    accs_svm = []
    accs_rf = []

    skf_ = StratifiedKFold(n_splits=cv_num_test, random_state=0, shuffle=True)

    # Split keeping the ratio of acquisition sites and ASD/TC simultaneously
    for cv_iteration_, (train_index_, test_index) in enumerate(skf_.split(data, split_ref_)):

        # List of standard scalers for each validation split
        scalers = []

        # List of trained models
        trained_transfer = []
        trained_classifier = []
        epochs = []

        # Split data
        x_train_, x_test = data[train_index_], data[test_index]
        labels_train_, labels_test = hc_ad[train_index_], hc_ad[test_index]
        split_ref = split_ref_[train_index_]
        
        skf = StratifiedKFold(n_splits=cv_num, random_state=0, shuffle=True)
        
        # Split keeping the ratio of acquisition sites and ASD/TC simultaneously
        for cv_iteration, (train_index, valid_index) in enumerate(skf.split(x_train_, split_ref)):
            epochs_cv = []
            # Split data
            x_train, x_valid = x_train_[train_index], x_train_[valid_index]
            labels_train, labels_valid = labels_train_[train_index], labels_train_[valid_index]
            
            # Standardize input
            scaler = StandardScaler()
            x_train = scaler.fit_transform(x_train)
            x_valid = scaler.transform(x_valid)
            
            scalers.append(scaler)
            
            # Train EIIC model
            model_trained_transfer = train_transfer(x_train, labels_train, x_valid, labels_valid, params['nn_params'])
            trained_transfer.append(model_trained_transfer)
            
            # Train simple MLP without contrastive learning
            model_trained_classifier = train_classifier(x_train, labels_train, x_valid, labels_valid, params['nn_params'])
            trained_classifier.append(model_trained_classifier)
        
        # Calculate confusion matrix from trained model
        matrix = matrix_from_models(trained_transfer, scalers, x_test, labels_test, params['nn_params']['num_classes'], params['nn_params']['device'])
        
        # Calculate performance indices from confusion matrix
        acc, recall, specificity, ppv, npv = model_measurements(matrix)
        accs_transfer.append(acc)
        measurements_transfer[cv_iteration_,:] = [acc, recall, specificity, ppv, npv]
            
        matrix = matrix_from_models_cl(trained_classifier, scalers, x_test, labels_test, params['nn_params']['num_classes'], params['nn_params']['device'])
    
        acc, recall, specificity, ppv, npv = model_measurements(matrix)
        accs_classifier.append(acc)
        measurements_classifier[cv_iteration_,:] = [acc, recall, specificity, ppv, npv]
        
        # PCA dimensionality reduction for SVM and RF
        pca = PCA(n_components = params['nn_params']['prefinal_num'])

        # Get the transformation of PCA from data excepting test data
        pca.fit(x_train_)

        # Transform data
        x_train_sc = pca.transform(x_train_)
        x_test_sc = pca.transform(x_test)
        
        # Train SVM and RF
        svm = train_svm(x_train_sc, labels_train_, skf.split(x_train_, split_ref), params['tuning_params_svm'])
        rf = train_rf(x_train_sc, labels_train_, skf.split(x_train_, split_ref), params['tuning_params_rf'])
        
        # Calculate confusion matrix and performance indices
        matrix = prediction_matrix(x_test_sc, labels_test, svm, params['nn_params']['num_classes'])
        acc, recall, specificity, ppv, npv = model_measurements(matrix)
        accs_svm.append(acc)
        measurements_svm[cv_iteration_,:] = [acc, recall, specificity, ppv, npv]
        
        matrix = prediction_matrix(x_test_sc, labels_test, rf, params['nn_params']['num_classes'])
        acc, recall, specificity, ppv, npv = model_measurements(matrix)
        accs_rf.append(acc)
        measurements_rf[cv_iteration_,:] = [acc, recall, specificity, ppv, npv]
        
        # Save models
        if params['save_FLAG']:
            models = {
                'nn_scalers': scalers,
                'pca': pca,
                'transfer_models': trained_transfer,
                'classifier_models': trained_classifier,
                'svm_model': svm,
                'rf_model': rf
            }
            save_models(models, params['output_dir'], str(cv_iteration_))
        
    # Output the performance indices as xlsx
    if params['save_FLAG']:
        models = {
            'transfer_models': measurements_transfer,
            'classifier_models': measurements_classifier,
            'svm_model': measurements_svm,
            'rf_model': measurements_rf
        }
        save_result_csv(models, ref, ['acc', 'recall', 'specificity', 'ppv', 'npv'], params['output_dir'])

    # Return accuracies for output
    return accs_transfer, accs_classifier, accs_svm, accs_rf
Exemple #16
0
    def train(self, plot_period: int=5):
        """ define loss-, optimzer- and scheduler-functions """
        criterion_disc = nn.BCELoss()
        criterion_gen = nn.BCELoss()

        optimizer_disc = torch.optim.Adam(self.discriminator.parameters(), lr=self.disc_lr, betas=(0.5, 0.999))
        optimizer_gen = torch.optim.Adam(self.generator.parameters(), lr=self.gen_lr, betas=(0.5, 0.999))

        """ create benchmark """
        self.benchmark_logger.create_entry(self.benchmark_id, optimizer_disc, criterion_disc, self.epochs, self.batch_size, self.disc_lr, self.gen_lr, self.disc_lr_decay, self.gen_lr_decay, self.lr_decay_period, self.gaussian_noise_range)

        # initial noise rate
        noise_rate = self.gaussian_noise_range[0]

        # total loss log
        loss_disc_history, loss_disc_real_history, loss_disc_fake_history = [], [], []
        loss_gen_history = []

        for epoch in range(self.epochs):
            # epoch loss log
            epoch_loss_disc, epoch_loss_disc_real, epoch_loss_disc_fake = [], [], []
            epoch_loss_gen = []

            for iteration in tqdm(range(self.iterations), ncols=120, desc="batch-iterations"):
                images_real, targets_real, images_fake, targets_fake = self._create_batch(iteration)

                """ train discriminator """
                # update every third iteration to make the generator stronger
                self.discriminator.zero_grad()

                # train with real images
                predictions_real = self.discriminator.train()(images_real, gaussian_noise_rate=noise_rate)
                loss_real = criterion_disc(predictions_real, targets_real)

                loss_real.backward()

                # train with fake images
                predictions_fake = self.discriminator.train()(images_fake, gaussian_noise_rate=noise_rate)
                loss_fake = criterion_disc(predictions_fake, targets_fake)

                loss_fake.backward(retain_graph=True)

                if iteration % 1 == 0:
                    optimizer_disc.step()

                # save losses
                epoch_loss_disc.append(loss_real.item() + loss_fake.item())
                epoch_loss_disc_real.append(loss_real.item())
                epoch_loss_disc_fake.append(loss_fake.item())

                """ train generator """
                self.generator.zero_grad()

                # train discriminator on fake images with target "real image" ([1, 0])
                predictions_fake = self.discriminator.train()(images_fake)
                loss_gen = criterion_gen(predictions_fake, targets_real)

                loss_gen.backward()
                optimizer_gen.step()

                epoch_loss_gen.append(loss_gen.item())
    

            """ linear gaussian noise decay for disc. inputs """
            noise_rate = np.linspace(self.gaussian_noise_range[0], self.gaussian_noise_range[1], self.epochs)[epoch]


            """ save models """
            save_models(self.generator, self.discriminator, save_to=(self.models_path), current_epoch=epoch, period=5)
            

            """ calculate average losses of the epoch """
            current_loss_disc, current_loss_disc_real, current_loss_disc_fake = round(np.mean(epoch_loss_disc), 4), round(np.mean(epoch_loss_disc_real), 4), round(np.mean(epoch_loss_disc_fake), 4)
            current_loss_gen = round(np.mean(epoch_loss_gen), 4)


            """ get learning-rate """
            current_disc_lr = round(optimizer_disc.param_groups[0]["lr"], 7)
            current_gen_lr = round(optimizer_gen.param_groups[0]["lr"], 7)


            """ learning-rate decay (set 'p' to 'False' for not doing lr-decay) """
            do = False
            if do:
                optimizer_disc.param_groups[0]["lr"] = lr_decay(lr=optimizer_disc.param_groups[0]["lr"], epoch=epoch, decay_rate=self.disc_lr_decay, period=self.lr_decay_period)
                optimizer_gen.param_groups[0]["lr"] = lr_decay(lr=optimizer_gen.param_groups[0]["lr"], epoch=epoch, decay_rate=self.gen_lr_decay, period=self.lr_decay_period)


            """ save losses for plotting """
            loss_disc_history.append(current_loss_disc); loss_disc_real_history.append(current_loss_disc_real); loss_disc_fake_history.append(current_loss_disc_fake)
            loss_gen_history.append(current_loss_gen)


            """ print trainings progress """
            print_progress(epoch, self.epochs, current_loss_disc, current_loss_disc_real, current_loss_disc_fake, current_loss_gen, current_disc_lr, current_gen_lr)


            """ plot generated images """
            if plot_period is not None:
                show_generated(self.generator, view_seconds=1, current_epoch=epoch, period=plot_period, save_to=(self.generated_images_path + "/" + str(epoch + 1) + ".png"))


        """ plot loss history """
        plot_loss_history(loss_disc_history, loss_disc_real_history, loss_disc_fake_history, loss_gen_history, save_to=(self.plots_path + "/" + self.benchmark_id + ".png"))
Exemple #17
0
def training(params,
             logger,
             train_func=do_forward_pass,
             save_model_to="",
             model_def=sinno_model):
    # create data loader
    source_loader = get_data_loader(data_path=params.source_data_path,
                                    params=params)
    target_loader = get_data_loader(data_path=params.target_data_path,
                                    params=params)

    # model components
    basic_feat_ext = model_def.BasicFeatExtractor(params=params)
    code_gen = model_def.CodeGen(params=params)
    discriminator = model_def.Discriminator(params=params)

    # optimizers
    learning_rate = params.learning_rate
    opt_basic_feat = torch.optim.Adam(basic_feat_ext.parameters(),
                                      lr=learning_rate)
    opt_code_gen = torch.optim.Adam(code_gen.parameters(), lr=learning_rate)
    opt_discriminator = torch.optim.Adam(discriminator.parameters(),
                                         lr=learning_rate)

    # for saving gradient
    grad_records = {}

    def save_grad(name):
        def hook(grad):
            grad_records[name] = grad

        return hook

    # training
    code_loss_records = []
    discr_loss_records = []
    discr_acc_records = []

    for i in range(params.iterations):
        # refresh data loader
        itertools.tee(source_loader)
        itertools.tee(target_loader)
        zipped_loader = enumerate(zip(source_loader, target_loader))
        acc_code_loss, acc_discr_loss, acc_discr_acc = 0, 0, 0
        logger.info("epoch {}/{} started".format(i, params.iterations))
        # train using minibatches
        for step, ((images_src, labels_src), (images_tgt,
                                              labels_tgt)) in zipped_loader:
            logger.info("batch {}".format(step))
            # clear gradients
            opt_basic_feat.zero_grad()
            opt_code_gen.zero_grad()
            opt_discriminator.zero_grad()

            # create input variables
            src_imgs = Variable(images_src).float()
            tgt_imgs = Variable(images_tgt).float()
            # src_lbls = Variable(labels_src)
            # tgt_lbls = Variable(labels_tgt)

            # call the specific training procedure to calculate loss
            train_out = train_func(params=params,
                                   basic_feat_ext=basic_feat_ext,
                                   code_gen=code_gen,
                                   discriminator=discriminator,
                                   imgs=[src_imgs, tgt_imgs],
                                   labels=[labels_src, labels_tgt])
            total_loss, code_loss, discr_loss, discr_acc = train_out[
                "total_loss"], train_out["code_loss"], train_out[
                    "discriminator_loss"], train_out["discriminator_acc"]

            # do weights update
            total_loss.backward()
            opt_basic_feat.step()
            opt_code_gen.step()
            opt_discriminator.step()

            acc_code_loss += code_loss.cpu().data.numpy()[0]
            acc_discr_loss += discr_loss.cpu().data.numpy()[0]
            acc_discr_acc += discr_acc

        code_loss_records.append(acc_code_loss / (step + 1))
        discr_loss_records.append(acc_discr_loss / (step + 1))
        discr_acc_records.append(acc_discr_acc / (step + 1))
        logger.info(
            "epoch {} | code loss: {}, discr loss: {}, discr acc: {}".format(
                i, acc_code_loss / (step + 1), acc_discr_loss / (step + 1),
                acc_discr_acc / (step + 1)))

    # save model params
    save_models(models={
        "basic_feat_ext": basic_feat_ext,
        "code_gen": code_gen,
        "discriminator": discriminator
    },
                save_model_to=save_model_to,
                save_obj=True,
                save_params=True)
    # save the training settings
    save_param_module(params=params,
                      save_to=os.path.join(save_model_to,
                                           "train_settings.txt"))
    logger.info("model saved")

    return {
        "code_loss_records": code_loss_records,
        "discr_loss_records": discr_loss_records,
        "discr_acc_records": discr_acc_records
    }
Exemple #18
0
                    g_loss.backward()
                    optimizer_G.step()

                    print(
                        "[{0:%Y/%m/%d %H:%M:%S}] [Epoch {1:d}/{2:d}] [Batch {3:d}/{4:d}] [D loss: {5:f}] [G loss: {6:f}]".format(datetime.datetime.now(),
                            epoch+1, opt.n_epochs, batch+1, n_batches, d_loss.item(), g_loss.item())
                    )

                    d_losses.append(d_losses_in_n_critic/opt.n_critic)
                    d_losses_in_n_critic = 0
                    g_losses.append(g_loss.item())

                if (epoch*n_batches + batch) % opt.save_images_every_n_batches == 0:
                    utils.plot_images(fake_imgs, fig_dir, model_name, epoch*n_batches + batch)
                    utils.plot_losses(d_losses, g_losses, opt.n_critic, fig_dir, model_name)

                if (epoch*n_batches + batch) % opt.save_weights_every_n_batches == 0:
                    utils.save_models({"gen": generator, "disc": discriminator}, model_dir, epoch*n_batches + batch,
                                      opt.keep_last_n_weights)

    except KeyboardInterrupt:
        pass

    # Save gen and disc
    print("Saving final models...")
    torch.save(generator, os.path.join(model_dir, model_name + "_generator.pth"))
    torch.save(discriminator, os.path.join(model_dir, model_name + "_discriminator.pth"))

    print("DONE.")
Exemple #19
0
def train(model, optimizer, train_loader,valid_loader, args):
    encoder, Kencoder, manager, decoder = [*model]
    parameters = list(encoder.parameters()) + list(Kencoder.parameters()) + \
                 list(manager.parameters()) + list(decoder.parameters())
    NLLLoss = nn.NLLLoss(reduction='mean', ignore_index=params.PAD)
    KLDLoss = nn.KLDivLoss(reduction='batchmean')

    for epoch in range(args.n_epoch):
        epoch_start_time = time.time()
        encoder.train(), Kencoder.train(), manager.train(), decoder.train()
        b_loss = 0
        k_loss = 0
        n_loss = 0
        t_loss = 0
        print('Start training epoch %d ...'%(epoch))
        for step, (src_X, src_y, src_K, tgt_y) in enumerate(train_loader):
            # if step>100:
            #     break
            src_X = src_X.cuda()
            src_y = src_y.cuda()
            src_K = src_K.cuda()
            tgt_y = tgt_y.cuda()

            optimizer.zero_grad()
            encoder_outputs, hidden, x = encoder(src_X)
            #Warning: masked_fill_ received a mask with dtype torch.uint8, this behavior is now deprecated,please use a mask with dtype torch.bool instead. (masked_fill__cuda at ..\aten\src\ATen\native\cuda\LegacyDefinitions.cpp:19)
            #encoder_mask = (src_X == 0)[:, :encoder_outputs.size(0)].unsqueeze(1).byte()
            encoder_mask = (src_X == 0)[:, :encoder_outputs.size(0)].unsqueeze(1).bool()

            y = Kencoder(src_y)
            K = Kencoder(src_K)
            prior, posterior, k_i, k_logits = manager(x, y, K)
            kldiv_loss = KLDLoss(prior, posterior.detach())

            n_vocab = params.n_vocab
            seq_len = src_y.size(1) - 1
            k_logits = k_logits.repeat(seq_len, 1, 1).transpose(0, 1).contiguous().view(-1, n_vocab)
            bow_loss = NLLLoss(k_logits, src_y[:, 1:].contiguous().view(-1))

            n_batch = src_X.size(0)
            max_len = tgt_y.size(1)

            outputs = torch.zeros(max_len, n_batch, n_vocab).cuda()
            hidden = hidden[params.n_layer:]
            output = torch.LongTensor([params.SOS] * n_batch).cuda()  # [n_batch]
            for t in range(max_len):
                output, hidden, attn_weights = decoder(output, k_i, hidden, encoder_outputs, encoder_mask)
                outputs[t] = output
                is_teacher = random.random() < args.tfr  # teacher forcing ratio
                top1 = output.data.max(1)[1]
                output = tgt_y[:, t] if is_teacher else top1

            outputs = outputs.transpose(0, 1).contiguous()
            nll_loss = NLLLoss(outputs.view(-1, n_vocab),
                               tgt_y.contiguous().view(-1))

            loss = kldiv_loss + nll_loss + bow_loss
            loss.backward()
            clip_grad_norm_(parameters, args.grad_clip)
            optimizer.step()
            b_loss += bow_loss.item()
            k_loss += kldiv_loss.item()
            n_loss += nll_loss.item()
            t_loss += loss.item()

            if (step + 1) % 10 == 0:
                k_loss /= 10
                n_loss /= 10
                b_loss /= 10
                t_loss /= 10
                print("Epoch [%.2d/%.2d],  Step [%.4d/%.4d], epoch_time:%.2f s: total_loss=%.4f kldiv_loss=%.4f bow_loss=%.4f nll_loss=%.4f"
                      % (epoch + 1, args.n_epoch,
                         step + 1, len(train_loader), time.time()-epoch_start_time,
                         t_loss, k_loss, b_loss, n_loss))
                k_loss = 0
                n_loss = 0
                b_loss = 0
                t_loss = 0

        print('Start evaluateing epoch %d ...' % (epoch))
        valid_loss =  evaluate_loss(model, epoch, valid_loader)
        # save models
        save_models(model, params.all_restore,epoch, valid_loss)
Exemple #20
0
def main():
    args = parse_arguments()
    n_vocab = params.n_vocab
    n_layer = params.n_layer
    n_hidden = params.n_hidden
    n_embed = params.n_embed
    n_batch = args.n_batch
    temperature = params.temperature
    train_path = params.train_path
    #test_path = params.test_path
    valid_path = params.valid_path
    vocab_path =  params.vocab_path
    assert torch.cuda.is_available()

    # print("building the vocab...")
    # vocab = build_vocab_music(train_path, n_vocab)

    # # save vocab
    # print("saving the vocab...")
    # with open(vocab_path, 'w',encoding='utf-8') as fp:
    #     json.dump(vocab.stoi, fp, ensure_ascii=False)
    # load vocab
    print("loading the vocab...")
    vocab = Vocabulary()
    with open(vocab_path, 'r',encoding='utf-8') as fp:
        vocab.stoi = json.load(fp)

    # load data and change to id
    print("loading_data...")
    train_X, train_y, train_K = load_data(train_path, vocab)

    train_loader = get_data_loader(train_X, train_y, train_K, n_batch,True)
    print("successfully loaded train data")
    valid_X, valid_y, valid_K = load_data(valid_path, vocab)
    valid_loader = get_data_loader(valid_X, valid_y, valid_K, n_batch,False)
    print("successfully loaded  valid data")


    encoder = Encoder(n_vocab, n_embed, n_hidden, n_layer, vocab).cuda()
    Kencoder = KnowledgeEncoder(n_vocab, n_embed, n_hidden, n_layer, vocab).cuda()
    manager = Manager(n_hidden, n_vocab, temperature).cuda()
    decoder = Decoder(n_vocab, n_embed, n_hidden, n_layer, vocab).cuda()

    if args.restore:
        encoder = init_model(encoder, restore=params.encoder_restore)
        Kencoder = init_model(Kencoder, restore=params.Kencoder_restore)
        manager = init_model(manager, restore=params.manager_restore)
        decoder = init_model(decoder, restore=params.decoder_restore)


    model = [encoder, Kencoder, manager, decoder]
    parameters = list(encoder.parameters()) + list(Kencoder.parameters()) + \
                 list(manager.parameters()) + list(decoder.parameters())
    optimizer = optim.Adam(parameters, lr=args.lr)

    # pre_train knowledge manager
    print("start pre-training")
    pre_train(model, optimizer, train_loader,args)
    print("start training")
    train(model, optimizer, train_loader,valid_loader , args)

    # save final model
    save_models(model, params.all_restore)
Exemple #21
0
def train(
    dataloader,
    discr,
    gen,
    discr_loss,
    gen_loss,
    discr_optimizer,
    gen_optimizer,
    device,
    n_epochs=500,
    n_discr=1,
    n_gen=1,
    image_interval=20,
    save_interval=20,
    score_interval=20,
    save_dir=None,
    tb_writer=None,
    scheduler=None,
    scorer=None,
    seed=999,
    verbose=True,
):

    # Set random seed for reproduceability
    random.seed(seed)
    torch.manual_seed(seed)

    step = 0

    try:

        with tqdm(total=n_epochs, desc=f'Progress: ', unit='epoch') as pbar:

            for epoch in range(n_epochs):

                for real in dataloader:

                    # Get real and fake data
                    real = real.to(device)
                    batch_size = real.shape[0]
                    fake = gen.sample(batch_size=batch_size)

                    # Train Discriminator
                    discr_optimizer.zero_grad()

                    D_real = discr(real)
                    D_fake = discr(fake.detach())

                    loss_discr = discr_loss(D_real, D_fake)
                    loss_discr.backward()

                    if epoch % (n_gen + n_discr) < n_discr:
                        discr_optimizer.step()

                    # Train Generator
                    gen_optimizer.zero_grad()

                    D_fake = discr(fake)

                    loss_gen = gen_loss(D_fake)
                    loss_gen.backward()

                    if epoch % (n_gen + n_discr) >= n_discr:
                        gen_optimizer.step()

                    is_last_epoch = (step == len(dataloader) * n_epochs - 1)

                    # Log Losses and Images
                    stats = {
                        'loss_D': loss_discr.item(),
                        'loss_G': loss_discr.item()
                    }
                    if tb_writer:
                        tb_writer.add_scalar(
                            'D_real',
                            torch.sigmoid(D_real).mean().item(), step)
                        tb_writer.add_scalar(
                            'D_fake',
                            torch.sigmoid(D_fake).mean().item(), step)
                        tb_writer.add_scalar('loss_D', stats['loss_D'], step)
                        tb_writer.add_scalar('loss_G', stats['loss_G'], step)

                        # Show generated images
                        if step % int(image_interval *
                                      len(dataloader)) == 1 or is_last_epoch:

                            with torch.no_grad():
                                fake = gen.fixed_sample().detach().cpu()

                            fake = F.interpolate(fake,
                                                 scale_factor=[1, 1, 0.5, 0.5],
                                                 mode='bilinear')
                            fake = vutils.make_grid(fake,
                                                    padding=2,
                                                    normalize=True)[np.newaxis]
                            tb_writer.add_images('images', fake, step)

                    # Save model
                    if step % int(save_interval *
                                  len(dataloader)) == 1 or is_last_epoch:
                        save_models(save_dir, gen, discr, step)

                    # Get score
                    if scorer:
                        if step % int(score_interval *
                                      len(dataloader)) == 1 or is_last_epoch:
                            if verbose:
                                print('Calculating score')
                            stats['score'] = scorer.get_score(gen, step)

                    step += 1

                # Update progress bar
                pbar.set_postfix(**stats)
                pbar.update()

        return True

    except KeyboardInterrupt:
        save_models(save_dir, gen, discr, step)
        return False
                optimizer.step()

            train_losses.append(float(loss))
            val_history_Us, val_future_Us = next(iter(val_dataloader))
            val_history_Xs = val_history_Us[:, :, 0].view(-1, k, 1)
            inferred_U_val = predict_state(val_history_Xs)
            val_loss = torch.mean(
                torch.abs(inferred_U_val.detach() - val_future_Us.detach())**2)
            val_losses.append(float(val_loss))
            scheduler.step(val_loss)

            if EPOCH % 2 == 0:
                print(
                    "EPOCH {} finished with training loss: {} | validation loss: {} | lr: {} "
                    .format(EPOCH, loss, val_loss, get_lr(optimizer)))
                save_models(model_dir, encoder_rnn)
                save_optimizer(model_dir, optimizer)

        print("TRAINING IS FINISHED!")
        plt.plot(np.log(train_losses),
                 label='train loss'), plt.plot(np.log(val_losses),
                                               label="validation loss")
        plt.legend(), plt.show()
        save_models(model_dir, encoder_rnn)
        save_optimizer(model_dir, optimizer)
    else:
        load_models(model_dir, encoder_rnn)
        load_optimizer(model_dir, optimizer)

    with torch.no_grad():
Exemple #23
0
def train_eval(dqn_agent, replay_buffer, env, eval_env, device, logger,
               CONFIG):
    """Train and evaluate agent on given environments according to given configuration."""
    # Log to TensorBoard and W&B
    if CONFIG.USE_TENSORBOARD:
        from torch.utils.tensorboard import SummaryWriter

        writer = SummaryWriter(log_dir="tensorboard_logs")
    if CONFIG.USE_WANDB:
        import wandb

        wandb.init(project="implementations-dqn", config=CONFIG)
        wandb.watch(dqn_agent.q_net)

    # Check if SAVE_DIR is defined
    if not CONFIG.SAVE_DIR:
        logger.warning("No save directory specified: the model will be lost!")
    else:
        # Episodic return of saved best model
        saved_model_eval_episode_return = -float("inf")
        # Unique save directory to prevent rewrite
        unique_save_dir = f"{CONFIG.SAVE_DIR}/{CONFIG.ENV_NAME}/{get_timestamp()}/"

    # Setup epsilon decay function
    get_epsilon = get_linear_anneal_func(
        start_value=CONFIG.EPSILON_DECAY_START_VALUE,
        end_value=CONFIG.EPSILON_DECAY_END_VALUE,
        start_step=CONFIG.EPSILON_DECAY_START_STEP,
        end_step=CONFIG.EPSILON_DECAY_END_STEP,
    )

    # Main training loop
    episode_return = 0
    episode_i = 0
    eval_i = 0
    obs = env.reset()
    for step_i in range(CONFIG.ENV_STEPS + 1):
        # Interact with the environment and save the experience
        epsilon = get_epsilon(step_i)
        action = dqn_agent.select_action(np.expand_dims(obs, 0), epsilon)
        next_obs, rew, done, info = env.step(action)
        replay_buffer.append(Transition(obs, action, rew, next_obs, done))

        # Train QNetwork
        if (step_i % CONFIG.UPDATE_FREQUENCY == 0
                and len(replay_buffer) >= CONFIG.MIN_REPLAY_BUFFER_SIZE):
            experiences = replay_buffer.get_torch_batch(CONFIG.BATCH_SIZE)
            td_loss = dqn_agent.train(experiences, discount=CONFIG.DISCOUNT)

            # Log td_loss and epsilon
            if step_i % CONFIG.LOG_FREQUENCY == 0:
                logger.debug(
                    "Episode {:4d}  Steps {:5d}  Epsilon {:6.6f}  Loss {:6.6f}"
                    .format(episode_i, step_i, epsilon, td_loss))
                if CONFIG.USE_TENSORBOARD:
                    writer.add_scalar("td_loss", td_loss, step_i)
                    writer.add_scalar("epsilon", epsilon, step_i)
                if CONFIG.USE_WANDB:
                    wandb.log({
                        "td_loss": td_loss,
                        "epsilon": epsilon
                    },
                              step=step_i)

        # Update target network periodically
        # NOTE(seungjaeryanlee): The paper specifies frequency measured in the number
        # of parameter updates, which is dependent on UPDATE_FREQUENCY. However, in
        # the code the frequency is measured in number of perceived states. We follow
        #  the latter.
        # https://github.com/deepmind/dqn/blob/9d9b1d1/dqn/NeuralQLearner.lua#L356
        if step_i % CONFIG.TARGET_NET_UPDATE_FREQUENCY == 0:
            dqn_agent.update_target_q_net()

        # Prepare for next step
        episode_return += rew
        obs = next_obs

        # Prepare for next episode if episode is finished
        if done:
            # Log episode metrics
            logger.info("Episode {:4d}  Steps {:5d}  Return {:4d}".format(
                episode_i, step_i, int(episode_return)))
            if CONFIG.USE_TENSORBOARD:
                writer.add_scalar("train/episode_return", episode_return,
                                  episode_i)
            if CONFIG.USE_WANDB:
                wandb.log(
                    {
                        "train/episode_return": episode_return,
                        "train/episode_count": episode_i,
                    },
                    step=step_i,
                )

            # Prepare for new episode
            env.reset()
            episode_return = 0
            episode_i += 1

        # Evaluate agent periodically
        if step_i % CONFIG.EVAL_FREQUENCY == 0 and CONFIG.EVAL_EPISODES > 0:
            all_eval_episode_return = []

            # Run multiple evaluation episodes
            for _ in range(CONFIG.EVAL_EPISODES):
                # Run evaluation
                eval_done = False
                eval_obs = eval_env.reset()
                eval_episode_return = 0
                while not eval_done:
                    eval_action = dqn_agent.select_action(
                        np.expand_dims(eval_obs, 0),
                        epsilon=CONFIG.EVAL_EPSILON)
                    eval_obs, eval_rew, eval_done, _ = eval_env.step(
                        eval_action)
                    eval_episode_return += eval_rew
                all_eval_episode_return.append(eval_episode_return)
            avg_eval_episode_return = np.mean(all_eval_episode_return)

            # Log results
            logger.info("EVALUATION    Steps {:5d}  Return {:7.2f}".format(
                step_i, avg_eval_episode_return))
            if CONFIG.USE_TENSORBOARD:
                writer.add_scalar("eval/avg_episode_return",
                                  avg_eval_episode_return, eval_i)
                writer.add_histogram("eval/episode_returns",
                                     np.array(all_eval_episode_return))
            if CONFIG.USE_WANDB:
                wandb.log(
                    {
                        "eval/avg_episode_return":
                        avg_eval_episode_return,
                        "eval/episode_returns":
                        wandb.Histogram(all_eval_episode_return),
                        "eval/episode_count":
                        eval_i,
                    },
                    step=step_i,
                )

            # Update save file if necessary
            if (CONFIG.SAVE_DIR and
                    saved_model_eval_episode_return <= eval_episode_return):
                saved_model_eval_episode_return = eval_episode_return
                save_models(
                    unique_save_dir,
                    filename="best",
                    q_net=dqn_agent.q_net,
                    optimizer=dqn_agent.optimizer,
                )
                logger.info(f"Model succesfully saved at {unique_save_dir}")

            eval_i += 1

    # Save trained agent
    if CONFIG.SAVE_DIR:
        save_models(
            unique_save_dir,
            filename="last",
            q_net=dqn_agent.q_net,
            optimizer=dqn_agent.optimizer,
        )
        logger.info(f"Model successfully saved at {unique_save_dir}")
Exemple #24
0
def main(batch_size,
         embed_size,
         num_hiddens,
         num_layers,
         ln_hidden,
         ln_output,
         rec_unit,
         learning_rate=1e-4,
         log_step=10,
         num_epochs=50,
         save_step=100,
         ngpu=1):
    # hyperparameters
    num_workers = 0
    checkpoint_dir = 'checkpoint'
    # Image Preprocessing

    transform = {
        'train':
        transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
        ]),
        'val':
        transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
        ]),
    }
    # load data
    vocab = build_vocab(path='relative_captions_shoes.json')
    train_data, train_loader = data_and_loader(
        path='relative_captions_shoes.json',
        mode='train',
        vocab=vocab,
        transform=transform['train'],
        batch_size=batch_size)

    val_data, val_loader = data_and_loader(path='relative_captions_shoes.json',
                                           mode='valid',
                                           vocab=vocab,
                                           transform=transform['val'],
                                           batch_size=batch_size)

    losses_val = []
    losses_train = []

    # Build the models
    initial_step = initial_epoch = 0

    encoder = CNN(embed_size)  ### embed_size: power of 2
    middle = fcNet(embed_size, ln_hidden, ln_output)
    decoder = RNN(ln_output,
                  num_hiddens,
                  len(vocab),
                  num_layers,
                  rec_unit=rec_unit,
                  drop_out=0.1)

    # Loss, parameters & optimizer
    loss_fun = nn.CrossEntropyLoss()
    params = list(decoder.parameters()) + list(
        encoder.linear.parameters()) + list(encoder.batchnorm.parameters())
    optimizer = torch.optim.Adam(params, lr=learning_rate)

    if torch.cuda.is_available():
        encoder.cuda()
        decoder.cuda()

    # Train the Models
    total_step = len(train_loader)
    try:
        for epoch in range(initial_epoch, num_epochs):
            print('Epoch: {}'.format(epoch))
            for step, (images, captions,
                       lengths) in enumerate(train_loader, start=initial_step):

                # Set mini-batch dataset
                images = Variable(images)
                captions = Variable(captions)
                targets = pack_padded_sequence(captions,
                                               lengths,
                                               batch_first=True)[0]

                # Forward, Backward and Optimize
                decoder.zero_grad()
                middle.zero_grad()
                encoder.zero_grad()

                if ngpu > 1:
                    # run on multiple GPUs
                    features = nn.parallel.data_parallel(
                        encoder, images, range(ngpu))
                    rnn_input = nn.parallel.data_parallel(
                        middle, features, range(ngpu))
                    outputs = nn.parallel.data_parallel(
                        decoder, features, range(ngpu))
                else:
                    # run on single GPU
                    features = encoder(images)
                    rnn_input = middle(features)
                    outputs = decoder(rnn_input, captions, lengths)

                train_loss = loss_fun(outputs, targets)
                losses_train.append(train_loss.item())
                train_loss.backward()
                optimizer.step()

                # Run validation set and predict
                if step % log_step == 0:
                    encoder.batchnorm.eval()
                    # run validation set
                    batch_loss_val = []
                    for val_step, (images, captions,
                                   lengths) in enumerate(val_loader):
                        images = Variable(images)
                        captions = Variable(captions)
                        targets = pack_padded_sequence(captions,
                                                       lengths,
                                                       batch_first=True)[0]
                        #features = encoder(target_images) - encoder(refer_images)
                        features = encoder(images)
                        rnn_input = middle(features)
                        outputs = decoder(rnn_input, captions, lengths)
                        val_loss = loss_fun(outputs, targets)
                        batch_loss_val.append(val_loss.item())

                    losses_val.append(np.mean(batch_loss_val))

                    # predict
                    sampled_ids = decoder.sample(rnn_input)
                    sampled_ids = sampled_ids.cpu().data.numpy()[0]
                    sentence = utils.convert_back_to_text(sampled_ids, vocab)
                    print('Sample:', sentence)

                    true_ids = captions.cpu().data.numpy()[0]
                    sentence = utils.convert_back_to_text(true_ids, vocab)
                    print('Target:', sentence)

                    print(
                        'Epoch: {} - Step: {} - Train Loss: {} - Eval Loss: {}'
                        .format(epoch, step, losses_train[-1], losses_val[-1]))
                    encoder.batchnorm.train()

                # Save the models
                if (step + 1) % save_step == 0:
                    save_models(encoder, middle, decoder, optimizer, step,
                                epoch, losses_train, losses_val,
                                checkpoint_dir)
                    dump_losses(losses_train, losses_val,
                                os.path.join(checkpoint_dir, 'losses.pkl'))

    except KeyboardInterrupt:
        pass
    finally:
        # Do final save
        utils.save_models(encoder, middle, decoder, optimizer, step, epoch,
                          losses_train, losses_val, checkpoint_dir)
        utils.dump_losses(losses_train, losses_val,
                          os.path.join(checkpoint_dir, 'losses.pkl'))
Exemple #25
0
def train(sess, env, env_eval, actor, critic, actor_eval, critic_eval, saver):
    def train_ep(p_ev=None, ep_len=None):
        t = time.time()
        ep_ave_r = run_episode(env,
                               actor,
                               critic,
                               replay_buffer,
                               rho_tar_list[-1],
                               pol_eval=p_ev,
                               episode_len=ep_len)
        ep_time = time.time() - t
        return ep_ave_r, ep_time

    def test_ep(name, plot, save):
        eval_len = config.eval_episode_len
        t = time.time()
        r, r_tar = test_actor(env_eval,
                              actor_eval,
                              critic_eval,
                              rho_list,
                              rho_tar_list,
                              eval_len=eval_len,
                              name=name,
                              plot=plot,
                              save=save)
        rho_list.append(r), rho_tar_list.append(r_tar)
        ev_time = time.time() - t

        return ev_time

    def table_title():
        logger.info(
            '{:^5} | {:^9} | {:^9} | {:^5} | {:^5} | {:^11} | {:^9} | {:^9} |'.
            format('Epi.', 'lr', 'Noise std', 'Epi. secs', 'Eval secs',
                   'Epi. Avg Ro', 'Rho', 'Rho Target'))

    def table_entry(idx):
        logger.info(
            '{:^5d} | {:^9.4e} | {:^9.4f} | {:^9d} | {:^9d} | {:^11.05f} | {:^9.05f} | {:^10.05f} |'
            .format(idx, actor.lr(), config.noise_std, int(ep_elapsed),
                    int(ev_elapsed), ep_ave_reward, rho_list[-1],
                    rho_tar_list[-1]))

    # initiate replay buffer
    replay_buffer = ReplayBuffer(config.buffer_size, config.seed)

    # initiate arrays for documenting average cumulative reward of online and target networks.
    rho_list, rho_tar_list = list(), list()

    logger.info("evaluating initial average reward")
    ev_elapsed = test_ep(name='pol_eval', plot=None, save=None)

    logger.info("performing initial episode of policy evaluation")
    ep_ave_reward, ep_elapsed = train_ep(p_ev=True, ep_len=1000)

    table_title()
    table_entry(-1)

    for i in range(config.episode_num):
        logger.debug("global step actor: {}".format(actor.global_step()))
        logger.debug("global step critic: {}".format(critic.global_step()))

        plot = None
        save = True if i % 50 == 0 else None

        ep_ave_reward, ep_elapsed = train_ep()
        ev_elapsed = test_ep(name=i, plot=plot, save=save)
        table_entry(i)

        if save:
            save_models(saver, sess, config.directory)

        if i % 100 == 0:
            print('long eval')
            test_actor(env_eval,
                       actor_eval,
                       critic_eval,
                       rho_list,
                       rho_tar_list,
                       eval_len=100,
                       name="final",
                       plot=True,
                       verbose=True)

    return rho_list, rho_tar_list
Exemple #26
0
def train(  
        dataloader,
        discr,
        gen,
        discr_loss,
        gen_loss,
        discr_optimizer,
        gen_optimizer,
        tb_writer,
        device,
        n_epochs = 500,
        n_discr = 1,
        n_gen = 1,
        image_interval = 1,
        save_interval = 1,
        save_dir = None,
        scheduler = None,
        seed = 999,
        ):
    
    
    random.seed(seed)
    torch.manual_seed(seed)
            
    step = 0
    
    try:
        
        with tqdm(total=n_epochs, desc=f'Progress: ',unit='epoch') as pbar:            
    
            for epoch in range(n_epochs):
                                
                for real in dataloader:
                    
                    # Get real and fake data
                    real = real.to(device)
                    batch_size = real.shape[0]
                    fake = gen.sample(batch_size = batch_size)
                                    
                    # Train Discriminator
                    discr_optimizer.zero_grad()  

                    D_real = discr(real)
                    D_fake = discr(fake.detach())

                    loss_discr = discr_loss(D_real,D_fake)
                    loss_discr.backward()
        
                    if epoch % (n_gen + n_discr) < n_discr:
                        discr_optimizer.step()
                                    
                    # Train Generator
                    gen_optimizer.zero_grad()

                    D_fake = discr(fake)

                    loss_gen = gen_loss(D_fake)
                    loss_gen.backward()

                    if epoch % (n_gen + n_discr) >= n_discr:
                        gen_optimizer.step()
                        
                    # Log Losses
                    tb_writer.add_scalar('D_real',torch.sigmoid(D_real).mean().item(),step)
                    tb_writer.add_scalar('D_fake',torch.sigmoid(D_fake).mean().item(),step)
                    tb_writer.add_scalar('loss_D',loss_discr.item(),step)
                    tb_writer.add_scalar('loss_G',loss_gen.item(),step)
                    
                    # Show generated images
                    if step % int(image_interval*len(dataloader)) == 1 or (step == len(dataloader)*n_epochs - 1):
                        
                        with torch.no_grad():
                            fake = gen.fixed_sample().detach().cpu()    
                        grid = vutils.make_grid(fake, padding=2, normalize=True)[np.newaxis]
                        tb_writer.add_images('images', grid, step)
                        
                        
                    if step % int(save_interval*len(dataloader)) == 1 or (step == len(dataloader)*n_epochs - 1):
                        save_models(save_dir,gen,discr,step)
                        
                        
                    step += 1
            
                pbar.set_postfix(**{'loss_D':loss_discr.item(),'loss_G':loss_discr.item()})
                pbar.update()
            
        return True
                
    except KeyboardInterrupt: 
        save_models(save_dir,gen,discr,step)
        return False
                           criterion=criterion,
                           conditional_gen=False)
        generative_trainer(loader_mix=loader_mix,
                           train_loader=loader2,
                           generator=generator2,
                           EP=EP,
                           arguments=arguments,
                           criterion=criterion,
                           conditional_gen=False)

    # save models
    savepath = os.path.join(os.getcwd(), 'model_parameters')
    if not os.path.exists(savepath):
        os.mkdir(savepath)

    ut.save_models([generator1, generator2], [discriminator1, discriminator2],
                   exp_info, savepath, arguments)

#check1 = generator1.parameters().next()
#print('Sum of generator1 parameters is:', check1.sum())
#
#check2 = generator2.parameters().next()
#print('Sum of generator2 parameters is:', check2.sum())

###

# Separate out the sources
if arguments.task == 'mnist':
    maxlikelihood_separatesources(
        generators=[generator1, generator2],
        discriminators=[discriminator1, discriminator2],
        loader_mix=loader_mix,
Exemple #28
0
                schema_enc_outputs, schema_enc_hidden = encoder_dict['SchemaEncoder'](schema.t())
                schema_enc_outputs = schema_enc_outputs.to(device)
                schema_enc_hidden = schema_enc_hidden.to(device)

                hidden = torch.cat((question_enc_hidden, schema_enc_hidden), dim=-1)
                enc_outputs = torch.cat((question_enc_outputs, schema_enc_outputs), dim=0)

                if n in [0, int(len(train_loader) / 3), 2 * int(len(train_loader) / 3)]:
                    print_outputs = True
                    print('\n\nText: {}\nSQL: {}'.format(' '.join(list(map(lambda i: idx2word[i.item()], text[0]))),
                                                         ' '.join(list(map(lambda i: idx2word[i.item()], sql[0])))))
                else:
                    print_outputs = False

                # sql, idx, h, encoder_outputs, decoder_dict, current_decoder, predictions, print_outputs
                outputs, targets, decoders = decoder_dict['RootDecoder'](sql, 0, hidden, enc_outputs, decoder_dict, 'RootDecoder', print_output=print_outputs)

                epoch_loss = 0
                for output, target, decoder_name in zip(outputs, targets, decoders):
                    zero_all_grads(encoder_optimizer, decoder_optimizer)
                    epoch_loss += loss(output, target)

                valid_loss += epoch_loss.double()
        print('Epoch: {}    total_cost =  {}    validLoss = {}'.format(epoch, total_cost, valid_loss))
        save_models(encoder_dict, decoder_dict, epoch)

        losses.append([total_cost, valid_loss])

    plt.plot(losses)
    plt.show()