Esempio n. 1
0
        assert (display.shape == (1, V))
        output_str = str(k) + ": "
        for v in xrange(self._V):
            if display[:, v]:
                output_str += vocab[v] + "\t"
        print(output_str)


"""
run HDP on a synthetic corpus.
"""
if __name__ == '__main__':
    from util.vocabulary import Vocabulary, parse_raw_text

    bdir = "../../data/nips12/"
    #data = import_monolingual_data(bdir + "doc.dat")
    data = parse_raw_text(bdir)
    data = data[:50]
    voca = Vocabulary(exclude_stopwords=True)
    corpus = [voca.doc2bow(doc) for doc in data]
    #corpus = numpy.array([numpy.random.poisson(1, k) for k in numpy.random.poisson(50, 20)])
    corpus = dict((i, j) for i, j in enumerate(corpus))

    gs = UncollapsedGibbsSampling()
    gs._initialize(corpus)

    gs.sample(100)

    print(gs._K)
    print(gs._n_kv)
Esempio n. 2
0
    def __init__(self, config, overfit=False):
        super().__init__()

        self.que_vocabulary = Vocabulary(config["dataset"]["word2id_path"])

        self.image_features = []
        self.image_boxes = []
        self.image_labels = []
        self.image_captions = []

        self.questions = []
        self.questions_ids = []
        self.questions_vecs = []
        self.answers = []
        self.config = config

        with open(config['dataset']['test']['test_qids'], 'r') as f:
            self.test_qids = json.load(f)

        with open(config['dataset']['test']['test_questions'], 'r') as f:
            self.test_questions = json.load(f)

        with open(config['dataset']['test']['test_answers'], 'r') as f:
            self.test_answers = json.load(f)

        with open(config['dataset']['test']['test_gt_facts'], 'r') as f:
            self.test_gt_facts = json.load(f)

        with open(config['dataset']['test']['test_captions'], 'r') as f:
            self.test_captions = json.load(f)

        with open(config['dataset']['test']['test_semantic_graph'], 'rb') as f:
            self.semantic_graphs = pickle.load(f, encoding='iso-8859-1')

        with open(config['dataset']['test']['test_labels'], 'r') as f:
            self.test_labels = json.load(f)

        with open(config['dataset']['test']['test_whs'], 'r') as f:
            self.test_whs = json.load(f)

        with open(config['dataset']['test']['test_top100_facts_graph'],
                  'rb') as f:
            self.test_top_facts = pickle.load(f, encoding='iso-8859-1')

        self.test_features = np.load(
            config['dataset']['test']['test_features'])

        self.test_bboxes = np.load(config['dataset']['test']['test_bboxes'])

        if overfit:
            self.test_qids = self.test_qids[:100]
            self.test_questions = self.test_questions[:100]
            self.test_answers = self.test_answers[:100]
            self.test_gt_facts = self.test_gt_facts[:100]

            self.test_top_facts = self.test_top_facts[:100]
            self.test_captions = self.test_captions[:100]
            self.test_bboxes = self.test_bboxes[:100]
            self.test_features = self.test_features[:100]
            self.test_whs = self.test_whs[:100]
            self.semantic_graphs = self.semantic_graphs[:100]
Esempio n. 3
0
def train():
   
    parser = argparse.ArgumentParser()
    # 配置文件
    parser.add_argument(
        "--config-yml",
        default="exp_fvqa/exp2.yml",
        help=
        "Path to a config file listing reader, model and solver parameters.")

    parser.add_argument("--cpu-workers",
                        type=int,
                        default=8,
                        help="Number of CPU workers for dataloader.")

    parser.add_argument(
        "--save-dirpath",
        default="fvqa/exp_data/checkpoints",
        help=
        "Path of directory to create checkpoint directory and save checkpoints."
    )

    parser.add_argument(
        "--load-pthpath",
        default="",
        help="To continue training, path to .pth file of saved checkpoint.")

    parser.add_argument("--gpus", default="", help="gpus")
    parser.add_argument(
        "--overfit",
        action="store_true",
        help="Whether to validate on val split after every epoch.")

    parser.add_argument(
        "--validate",
        action="store_true",
        help="Whether to validate on val split after every epoch.")

    args = parser.parse_args()

    # set mannual seed
    torch.manual_seed(10)
    torch.cuda.manual_seed(10)
    cudnn.benchmark = True
    cudnn.deterministic = True

    config = yaml.load(open(args.config_yml))

    device = torch.device("cuda:0") if args.gpus != "cpu" else torch.device(
        "cpu")

    # Print config and args.
    print(yaml.dump(config, default_flow_style=False))
    for arg in vars(args):
        print("{:<20}: {}".format(arg, getattr(args, arg)))

 
    print('Loading TrainDataset...')
    train_dataset = FvqaTrainDataset(config, overfit=args.overfit)
    train_dataloader = DataLoader(train_dataset,
                                  batch_size=config['solver']['batch_size'],
                                  num_workers=args.cpu_workers,
                                  shuffle=True,
                                  collate_fn=collate_fn)

    if args.validate:
        print('Loading TestDataset...')
        val_dataset = FvqaTestDataset(config, overfit=args.overfit)
        val_dataloader = DataLoader(val_dataset,
                                    batch_size=config['solver']['batch_size'],
                                    num_workers=args.cpu_workers,
                                    shuffle=True,
                                    collate_fn=collate_fn)


    print('Loading glove...')
    que_vocab = Vocabulary(config['dataset']['word2id_path'])
    glove = np.load(config['dataset']['glove_vec_path'])
    glove = torch.Tensor(glove)


    print('Building Model...')
    model = CMGCNnet(config,
                     que_vocabulary=que_vocab,
                     glove=glove,
                     device=device)

    if torch.cuda.device_count() > 1 and args.gpus != "cpu":
        print("Let's use", torch.cuda.device_count(), "GPUs!")
        model = nn.DataParallel(model)

    model = model.to(device)
    print(model)


    iterations = len(train_dataset) // config["solver"]["batch_size"] + 1

    def lr_lambda_fun(current_iteration: int) -> float:
   
        current_epoch = float(current_iteration) / iterations
        if current_epoch <= config["solver"]["warmup_epochs"]:
            alpha = current_epoch / float(config["solver"]["warmup_epochs"])
            return config["solver"]["warmup_factor"] * (1. - alpha) + alpha
        else:
            idx = bisect(config["solver"]["lr_milestones"], current_epoch)
            return pow(config["solver"]["lr_gamma"], idx)


    optimizer = optim.Adamax(model.parameters(),
                             lr=config["solver"]["initial_lr"])
    scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lr_lambda_fun)
    T = iterations * (config["solver"]["num_epochs"] -
                      config["solver"]["warmup_epochs"] + 1)
    scheduler2 = lr_scheduler.CosineAnnealingLR(
        optimizer, int(T), eta_min=config["solver"]["eta_min"], last_epoch=-1)

   
    summary_writer = SummaryWriter(log_dir=args.save_dirpath)
    checkpoint_manager = CheckpointManager(model,
                                           optimizer,
                                           args.save_dirpath,
                                           config=config)


    if args.load_pthpath == "":
        start_epoch = 0
    else:

        start_epoch = int(args.load_pthpath.split("_")[-1][:-4])

        model_state_dict, optimizer_state_dict = load_checkpoint(
            args.load_pthpath)
        if isinstance(model, nn.DataParallel):
            model.module.load_state_dict(model_state_dict)
        else:
            model.load_state_dict(model_state_dict)
        optimizer.load_state_dict(optimizer_state_dict)
        print("Loading resume model from {}...".format(args.load_pthpath))


    global_iteration_step = start_epoch * iterations

    for epoch in range(start_epoch, config['solver']['num_epochs']):

        print(f"\nTraining for epoch {epoch}:")

        train_answers = []
        train_preds = []

        for i, batch in enumerate(tqdm(train_dataloader)):
            optimizer.zero_grad()
            fact_batch_graph = model(batch)
            batch_loss = cal_batch_loss(fact_batch_graph,
                                        batch,
                                        device,
                                        neg_weight=0.1,
                                        pos_weight=0.9)

            batch_loss.backward()
            optimizer.step()

            fact_graphs = dgl.unbatch(fact_batch_graph)
            for i, fact_graph in enumerate(fact_graphs):
                train_pred = fact_graph.ndata['h'].squeeze()  # (num_nodes,1)
                train_preds.append(train_pred)  # [(num_nodes,)]
                train_answers.append(batch['facts_answer_id_list'][i])

            summary_writer.add_scalar('train/loss', batch_loss,
                                      global_iteration_step)
            summary_writer.add_scalar("train/lr",
                                      optimizer.param_groups[0]["lr"],
                                      global_iteration_step)
            summary_writer.add_text('train/loss', str(batch_loss.item()),
                                    global_iteration_step)
            summary_writer.add_text('train/lr',
                                    str(optimizer.param_groups[0]["lr"]),
                                    global_iteration_step)

            if global_iteration_step <= iterations * config["solver"][
                "warmup_epochs"]:
                scheduler.step(global_iteration_step)
            else:
                global_iteration_step_in_2 = iterations * config["solver"][
                    "warmup_epochs"] + 1 - global_iteration_step
                scheduler2.step(int(global_iteration_step_in_2))

            global_iteration_step = global_iteration_step + 1
            torch.cuda.empty_cache()


        checkpoint_manager.step()
        train_acc_1, train_acc_3 = cal_acc(
            train_answers, train_preds)
        print(
            "trainacc@1={:.2%} & trainacc@3={:.2%} "
                .format(train_acc_1, train_acc_3))
        summary_writer.add_scalars(
            'train/acc', {
                'acc@1': train_acc_1,
                'acc@3': train_acc_3

            }, epoch)


        if args.validate:
            model.eval()
            answers = []  # [batch_answers,...]
            preds = []  # [batch_preds,...]
            print(f"\nValidation after epoch {epoch}:")
            for i, batch in enumerate(tqdm(val_dataloader)):
                with torch.no_grad():
                    fact_batch_graph = model(batch)
                batch_loss = cal_batch_loss(fact_batch_graph,
                                            batch,
                                            device,
                                            neg_weight=0.1,
                                            pos_weight=0.9)

                summary_writer.add_scalar('test/loss', batch_loss, epoch)
                fact_graphs = dgl.unbatch(fact_batch_graph)
                for i, fact_graph in enumerate(fact_graphs):
                    pred = fact_graph.ndata['h'].squeeze()  # (num_nodes,1)
                    preds.append(pred)  # [(num_nodes,)]
                    answers.append(batch['facts_answer_id_list'][i])

            acc_1, acc_3 = cal_acc(answers, preds)
            print("acc@1={:.2%} & acc@3={:.2%} ".
                  format(acc_1, acc_3))
            summary_writer.add_scalars('test/acc', {
                'acc@1': acc_1,
                'acc@3': acc_3
            }, epoch)

            model.train()
            torch.cuda.empty_cache()
    print('Train finished !!!')
    summary_writer.close()
Esempio n. 4
0
    def __init__(self, config, overfit=False):
        super().__init__()

        self.que_vocabulary = Vocabulary(config["dataset"]["word2id_path"])

        self.image_features = []
        self.image_boxes = []
        self.image_labels = []
        self.image_captions = []

        self.questions = []
        self.questions_ids = []
        self.questions_vecs = []
        self.answers = []
        self.config = config

        # 问题的 id
        with open(config['dataset']['train']['train_qids'], 'r') as f:
            self.train_qids = json.load(f)
        # 问题
        with open(config['dataset']['train']['train_questions'], 'r') as f:
            self.train_questions = json.load(f)
        # 答案
        with open(config['dataset']['train']['train_answers'], 'r') as f:
            self.train_answers = json.load(f)
        # gt fact
        with open(config['dataset']['train']['train_gt_facts'], 'r') as f:
            self.train_gt_facts = json.load(f)
        # caption
        with open(config['dataset']['train']['train_captions'], 'r') as f:
            self.train_captions = json.load(f)
        # semantic graph
        with open(config['dataset']['train']['train_semantic_graph'], 'rb') as f:
            self.semantic_graphs = pickle.load(f, encoding='iso-8859-1')
        # 图像bbox 对应的 label
        with open(config['dataset']['train']['train_labels'], 'r') as f:
            self.train_labels = json.load(f)
        # 图像的长宽
        with open(config['dataset']['train']['train_whs'], 'r') as f:
            self.train_whs = json.load(f)
        # 抽取到的 facts
        # with open(config['dataset']['train']['train_facts_graph'], 'rb') as f:
        #     self.train_facts = pickle.load(f, encoding='iso-8859-1')
        with open(config['dataset']['train']['train100_facts_graph'],
                  'rb') as f:
            self.train_top_facts = pickle.load(f, encoding='iso-8859-1')
        # 图像 bbox 的特征
        self.train_features = np.load(
            config['dataset']['train']['train_features'])
        # 图像的 bbox 几何信息
        self.train_bboxes = np.load(config['dataset']['train']['train_bboxes'])

        if overfit:
            self.train_qids = self.train_qids[:100]
            self.train_questions = self.train_questions[:100]
            self.train_answers = self.train_answers[:100]
            self.train_gt_facts = self.train_gt_facts[:100]
            # self.train_facts = self.train_facts[:100]
            self.train_top_facts = self.train_top_facts[:100]
            self.train_captions = self.train_captions[:100]
            self.train_bboxes = self.train_bboxes[:100]
            self.train_features = self.train_features[:100]
            self.train_whs = self.train_whs[:100]
            self.semantic_graphs=self.semantic_graphs[:100]