Exemplo n.º 1
0
    def verify(batch_size):
        print('verifying batch size: ', batch_size)
        fold = Fold()
        num_samples = 100
        inputs = []
        fold_preds = []
        for i in range(num_samples):
            # get next batch
            l_sent = l_sentences[i]
            r_sent = r_sentences[i]
            sent = mx.nd.concat(l_sent, r_sent, dim=0)
            l_len = len(l_sent)
            l_tree = l_trees[i]
            r_tree = r_trees[i]

            inputs.append((sent, l_len, l_tree, r_tree))
            z_fold = net.fold_encode(fold, sent, l_len, l_tree, r_tree)
            fold_preds.append(z_fold)

            if (i + 1) % batch_size == 0 or (i + 1) == num_samples:
                fold_outs = fold([fold_preds])[0]
                outs = mx.nd.concat(*[
                    net(sent, l_len, l_tree, r_tree)
                    for sent, l_len, l_tree, r_tree in inputs
                ],
                                    dim=0)
                if not almost_equal(fold_outs.asnumpy(), outs.asnumpy()):
                    print(fold_preds)
                    print('l_sents: ', l_sent, l_sentences[i - 1])
                    print('r_sents: ', r_sent, r_sentences[i - 1])
                    print('\n'.join(
                        (str(l_tree), str_tree(l_tree), str(r_tree),
                         str_tree(r_tree), str(l_trees[i - 1]),
                         str_tree(l_trees[i - 1]), str(r_trees[i - 1]),
                         str_tree(r_trees[i - 1]), str(fold))))
                    assert_almost_equal(fold_outs.asnumpy(), outs.asnumpy())
                fold_preds = []
                inputs = []
                fold.reset()
Exemplo n.º 2
0
def test(ctx, data_iter, best, mode='validation', num_iter=-1):
    data_iter.reset()
    num_samples = len(data_iter)
    data_iter.set_context(ctx[0])
    preds = []
    labels = [mx.nd.array(data_iter.labels, ctx=ctx[0]).reshape((-1, 1))]
    if opt.fold:
        fold = Fold()
        fold_preds = []
        for j in tqdm(range(num_samples),
                      desc='Testing in {} mode'.format(mode)):
            # get next batch
            l_tree, l_sent, r_tree, r_sent, label = data_iter.next()
            # forward calculation. the output is log probability
            z = net.fold_encode(fold, l_sent, r_sent, l_tree, r_tree)
            fold_preds.append(z)
            # update weight after every batch_size samples, or when reaches last sample
            if (j + 1) % batch_size == 0 or (j + 1) == num_samples:
                preds.append(fold([fold_preds], True)[0])
                fold_preds = []
    else:
        for j in tqdm(range(num_samples),
                      desc='Testing in {} mode'.format(mode)):
            l_tree, l_sent, r_tree, r_sent, label = data_iter.next()
            z = net(l_sent, r_sent, l_tree, r_tree)
            preds.append(z)

    if mode == 'validation' and num_iter >= 0:
        preds = to_score(mx.nd.concat(*preds, dim=0))
        metric.update(preds, labels)
        names, values = metric.get()
        metric.reset()
        for name, acc in zip(names, values):
            logging.info(mode + ' acc: %s=%f' % (name, acc))
            if name == 'pearsonr':
                test_r = acc
        if test_r >= best:
            best = test_r
            logging.info('New optimum found: {}. Checkpointing.'.format(best))
            net.collect_params().save(
                'childsum_tree_lstm_{}.params'.format(num_iter))
            test(ctx, test_iter, -1, 'test')
        return best
Exemplo n.º 3
0
def build_folds(data_spec=None, kfolds=None):
    """
    Create Datasources, ML Model and Evaluation for each fold. Returns
        a list of newly created evaluation IDs for all folds.

    Args:
        data_spec: the named tuple object that wraps dataset related
            parameters.
        kfolds: the integer number representing the number of folds.
    Returns:
        a list of newly created evaluation IDs.
    """
    folds = [
        Fold(data_spec=data_spec, this_fold=i, kfolds=kfolds)
        for i in range(kfolds)
    ]
    for f in folds:
        f.build()  # each fold creates entities
        logger.info(f)  # prints details of folds
    return [f.ev_id for f in folds]  # return list of eval IDs
Exemplo n.º 4
0
 def split_into_folds(self):
     """
     Split each person's
     images into each fold
     """
     for x in range(self.num_folds):
         images = []
         labels = []
         for person in self.people:
             portion = len(person) // (self.num_folds - x)
             images += person.pictures[0:portion]
             labels += [person.name] * portion
             del person.pictures[0:portion]
         if (len(images) >= self.num_folds) and (len(labels)
                                                 == len(images)):
             fold = Fold(images, labels)
             self.folds.append(fold)
         else:
             raise ValueError
     print('done')
Exemplo n.º 5
0
def build_folds(data_spec=None, kfolds=None):
    """
    Create Fold objects that will build Datasources for each fold.

    Args:
        data_spec: the named tuple object that wraps dataset related
            parameters.
        kfolds: the integer number representing the number of folds.
    Returns:
        a list of newly created Fold objects.
    """
    folds = [
        Fold(data_spec=data_spec, this_fold=i, kfolds=kfolds)
        for i in range(kfolds)
    ]

    for f in folds:
        f.build()  # each fold creates a Datasource
        logger.debug(f)

    return folds
Exemplo n.º 6
0
def train(epoch, ctx, train_data, dev_data):

    # initialization with context
    if isinstance(ctx, mx.Context):
        ctx = [ctx]
    train_data.set_context(ctx[0])
    dev_data.set_context(ctx[0])

    # set up trainer for optimizing the network.
    trainer = gluon.Trainer(net.collect_params(), optimizer, {
        'learning_rate': opt.lr,
        'wd': opt.wd
    })

    best_r = -1
    Loss = gluon.loss.KLDivLoss()
    fold = Fold()
    for i in range(epoch):
        train_data.reset()
        num_samples = len(train_data)
        # collect predictions and labels for evaluation metrics
        preds = []
        fold_preds = []
        labels = [mx.nd.array(train_data.labels, ctx=ctx[0]).reshape((-1, 1))]
        losses = []
        if opt.fold:
            for j in tqdm(range(num_samples),
                          desc='Training epoch {}'.format(i)):
                # get next batch
                l_tree, l_sent, r_tree, r_sent, label = train_data.next()
                with ag.record():
                    # forward calculation. the output is log probability
                    z = net.fold_encode(fold, l_sent, r_sent, l_tree, r_tree)
                    fold_preds.append(z)
                    # calculate loss
                    with l_sent.context:
                        label = to_target(label)
                    loss = fold.record(0, Loss, z, label)
                    losses.append(loss)
                # update weight after every batch_size samples, or when reaches last sample
                if (j + 1) % batch_size == 0 or (j + 1) == num_samples:
                    with ag.record():
                        fold_preds, loss = fold([fold_preds, losses], True)
                        preds.append(fold_preds)
                        losses = []
                        fold_preds = []
                        fold.reset()
                    loss.backward()
                    trainer.step(batch_size)
        else:
            for j in tqdm(range(num_samples),
                          desc='Training epoch {}'.format(i)):
                # get next batch
                l_tree, l_sent, r_tree, r_sent, label = train_data.next()
                # use autograd to record the forward calculation
                with ag.record():
                    # forward calculation. the output is log probability
                    z = net(l_sent, r_sent, l_tree, r_tree)
                    # calculate loss
                    with l_sent.context:
                        label = to_target(label)
                    loss = Loss(z, label)
                    # backward calculation for gradients.
                    loss.backward()
                    preds.append(z)
                # update weight after every batch_size samples
                if (j + 1) % batch_size == 0 or (j + 1) == num_samples:
                    trainer.step(batch_size)

        # translate log-probability to scores, and evaluate
        preds = to_score(mx.nd.concat(*preds, dim=0))
        metric.update(preds, labels)
        names, values = metric.get()
        metric.reset()
        for name, acc in zip(names, values):
            logging.info('training acc at epoch %d: %s=%f' % (i, name, acc))
        best_r = test(ctx, dev_data, best_r, num_iter=i)