Exemplo n.º 1
0
def calc_confusion(loader, data, ref_to_beams, rl_crit, params, xp):
    img_to_ref_ids = {}
    for item in data:
        ref_id = item['ref_id']
        image_id = loader.Refs[ref_id]['image_id']
        if image_id not in img_to_ref_ids:
            img_to_ref_ids[image_id] = []
        img_to_ref_ids[image_id].append(ref_id)

    img_to_ref_confusion = {}
    for image_id in tqdm(img_to_ref_ids):
        img_to_ref_confusion[image_id] = {}
        img_ref_ids = img_to_ref_ids[image_id]
        img_ann_ids = [loader.Refs[ref_id]['ann_id'] for ref_id in img_ref_ids]
        sp_cxt_feats, _, feats, local_shapes = loader.fetch_feats(
            img_ann_ids, 1, params)

        feats = Variable(xp.array(feats, dtype=xp.float32))
        sp_cxt_feats = Variable(xp.array(sp_cxt_feats, dtype=xp.float32))
        for ref_id in img_ref_ids:
            sents = [one['sent'] for one in ref_to_beams[ref_id]]
            lang_last_ind = np.array([len(sent) for sent in sents])
            seqz = loader.encode_sequence(sents)
            lang_last_ind = calc_max_ind(seqz)
            out_score = []
            for one_ind in range(len(seqz)):
                one_seq = Variable(
                    xp.array([seqz[one_ind] for _ in range(feats.shape[0])],
                             dtype=xp.int32))
                one_last_ind = [
                    lang_last_ind[one_ind] for _ in range(feats.shape[0])
                ]
                coord = cuda.to_cpu(
                    feats[:,
                          sum(rl_crit.ve.feat_ind[:1]):sum(rl_crit.ve.
                                                           feat_ind[:2])].data)
                score = cuda.to_cpu(
                    F.sigmoid(
                        rl_crit.calc_score(feats, sp_cxt_feats, coord, one_seq,
                                           one_last_ind)).data)[:, 0]
                out_score.append(score)
            print(np.array(out_score).shape)
            img_to_ref_confusion[image_id][ref_id] = np.array(out_score)
    return img_to_ref_ids, img_to_ref_confusion
Exemplo n.º 2
0
def train_all(params):
    target_save_dir = osp.join(params['save_dir'], 'prepro',
                               params['dataset'] + '_' + params['splitBy'])
    graph_dir = osp.join('log_graph',
                         params['dataset'] + '_' + params['splitBy'])
    model_dir = osp.join(params['save_dir'], 'model',
                         params['dataset'] + '_' + params['splitBy'])

    if params['old']:
        params['data_json'] = 'old' + params['data_json']
        params['data_h5'] = 'old' + params['data_h5']
        params['image_feats'] = 'old' + params['image_feats']
        params['sp_ann_feats'] = 'old' + params['sp_ann_feats']
        params['ann_feats'] = 'old' + params['ann_feats']
        params['ann_shapes'] = 'old' + params['ann_shapes']
        params['id'] = 'old' + params['id']
        params['word_emb_path'] = 'old' + params['word_emb_path']

    if params['dataset'] in ['refcoco', 'refcoco+', 'refcocog']:
        global_shapes = (224, 224)
    elif params['dataset'] == 'refgta':
        global_shapes = (480, 288)

    loader = DataLoader(params)

    # model setting
    batch_size = params['batch_size']
    gpu_id = params['gpu_id']
    cuda.get_device(gpu_id).use()
    xp = cuda.cupy
    featsOpt = {
        'sp_ann': osp.join(target_save_dir, params['sp_ann_feats']),
        'ann_input': osp.join(target_save_dir, params['ann_feats']),
        'img': osp.join(target_save_dir, params['image_feats']),
        'shapes': osp.join(target_save_dir, params['ann_shapes'])
    }
    loader.loadFeats(featsOpt, mmap_mode=False)
    loader.shuffle('train')

    ve = VisualEncoder(res6=L.ResNet152Layers().fc6,
                       global_shapes=global_shapes).to_gpu(gpu_id)
    rl_crit = ListenerReward(len(loader.ix_to_word),
                             global_shapes=global_shapes).to_gpu(gpu_id)
    lm = LanguageModel(len(loader.ix_to_word),
                       loader.seq_length,
                       global_shapes,
                       res6=L.ResNet152Layers().fc6).to_gpu(gpu_id)

    serializers.load_hdf5(osp.join(model_dir, params['id'] + ".h5"), rl_crit)

    ve_optim = optimizers.Adam(alpha=4e-5, beta1=0.8)
    lm_optim = optimizers.Adam(alpha=4e-4, beta1=0.8)

    ve_optim.setup(ve)
    lm_optim.setup(lm)

    ve_optim.add_hook(chainer.optimizer.GradientClipping(params['grad_clip']))
    lm_optim.add_hook(chainer.optimizer.GradientClipping(params['grad_clip']))

    ## non-finetune layer
    ve.joint_enc.W.update_rule.hyperparam.alpha = 4e-4
    ve.joint_enc.b.update_rule.hyperparam.alpha = 4e-4
    lm.gaussian_p.x_var.update_rule.hyperparam.alpha = 1e-2
    lm.gaussian_p.y_var.update_rule.hyperparam.alpha = 1e-2
    ve.gaussian_p.x_var.update_rule.hyperparam.alpha = 1e-2
    ve.gaussian_p.y_var.update_rule.hyperparam.alpha = 1e-2

    iteration = 0
    epoch = 0
    lam = params['rank_lam']
    val_loss_history = []
    val_loss_lm_s_history = []
    val_loss_lm_l_history = []
    val_loss_l_history = []
    val_acc_history = []
    val_rank_acc_history = []
    min_val_loss = 100
    while True:
        chainer.config.train = True
        chainer.config.enable_backprop = True
        ve.zerograds()
        lm.zerograds()
        rl_crit.zerograds()

        start = time.time()

        data = loader.getBatch('train', params)

        ref_ann_ids = data['ref_ann_ids']

        pos_feats = Variable(xp.array(data['feats'], dtype=xp.float32))
        pos_sp_cxt_feats = Variable(
            xp.array(data['sp_cxt_feats'], dtype=xp.float32))
        pos_sp_ann_feats = Variable(
            xp.array(data['sp_ann_feats'], dtype=xp.float32))

        neg_feats = Variable(xp.array(data['neg_feats'], dtype=xp.float32))
        neg_pos_sp_cxt_feats = Variable(
            xp.array(data['neg_sp_cxt_feats'], dtype=xp.float32))
        neg_pos_sp_ann_feats = Variable(
            xp.array(data['neg_sp_ann_feats'], dtype=xp.float32))
        local_shapes = np.concatenate([
            data['local_shapes'], data['neg_local_shapes'],
            data['local_shapes']
        ],
                                      axis=0)

        feats = F.concat([pos_feats, neg_feats, pos_feats], axis=0)
        sp_cxt_feats = F.concat(
            [pos_sp_cxt_feats, neg_pos_sp_cxt_feats, pos_sp_cxt_feats], axis=0)
        sp_ann_feats = F.concat(
            [pos_sp_ann_feats, neg_pos_sp_ann_feats, pos_sp_ann_feats], axis=0)
        seqz = np.concatenate([data['seqz'], data['seqz'], data['neg_seqz']],
                              axis=0)
        lang_last_ind = calc_max_ind(seqz)
        seqz = Variable(xp.array(seqz, dtype=xp.int32))

        coord = cuda.to_cpu(
            feats[:, sum(ve.feat_ind[:1]):sum(ve.feat_ind[:2])].data)
        local_sp_coord, global_sp_coord = calc_coordinate_feature(
            coord, local_shapes, global_shapes=global_shapes)
        local_sp_coord, global_sp_coord = xp.array(local_sp_coord,
                                                   dtype=xp.float32), xp.array(
                                                       global_sp_coord,
                                                       dtype=xp.float32)

        # encode vis feature
        vis_feats = ve(feats, sp_cxt_feats, coord)
        sp_feats, sp_feats_emb = lm.calc_spatial_features(
            sp_cxt_feats, sp_ann_feats, local_sp_coord, global_sp_coord)

        logprobs = lm(vis_feats, sp_feats, sp_feats_emb, coord, seqz,
                      lang_last_ind)

        # lang loss
        pairP, vis_unpairP, lang_unpairP = F.split_axis(logprobs, 3, axis=1)
        pair_num, _, lang_unpair_num = np.split(lang_last_ind, 3)
        num_labels = {'T': xp.array(pair_num), 'F': xp.array(lang_unpair_num)}
        lm_flows = {
            'T': pairP,
            'visF': [pairP, vis_unpairP],
            'langF': [pairP, lang_unpairP]
        }
        lm_loss = lm_crits(lm_flows,
                           num_labels,
                           params['lm_margin'],
                           vlamda=params['vis_rank_weight'],
                           llamda=params['lang_rank_weight'])

        # RL loss (pos,pos)
        rl_vis_feats = F.split_axis(vis_feats, 3, axis=0)[0]
        rl_coord = np.split(coord, 3, axis=0)[0]
        rl_sp_vis_feats = F.split_axis(sp_feats, 3, axis=0)[0]
        rl_sp_vis_emb = F.split_axis(sp_feats_emb, 3, axis=0)[0]
        sampled_seq, sample_log_probs = lm.sample(rl_vis_feats,
                                                  rl_sp_vis_feats,
                                                  rl_sp_vis_emb, rl_coord)
        sampled_lang_last_ind = calc_max_ind(sampled_seq)
        rl_loss = rl_crit(pos_feats, pos_sp_cxt_feats, rl_coord, sampled_seq,
                          sample_log_probs, sampled_lang_last_ind)

        loss = lm_loss + rl_loss
        print(lm_loss, rl_loss)

        if params['dataset'] == 'refgta' and params[
                'ranking'] and iteration > 8000:
            lam += 0.4 / 8000
            score = F.sum(pairP, axis=0) / (xp.array(pair_num + 1))
            rank_loss = calc_rank_loss(score, data['rank'], margin=0.01) * lam
            loss += rank_loss
        loss.backward()

        ve_optim.update()
        lm_optim.update()

        if data['bounds']['wrapped']:
            print('one epoch finished!')
            loader.shuffle('train')

        if iteration % params['losses_log_every'] == 0:
            acc = xp.where(rl_crit.reward > 0.5, 1, 0).mean()
            print('{} iter : train loss {}, acc : {} reward_mean : {}'.format(
                iteration, loss.data, acc, rl_crit.reward.mean()))

        if (iteration % params['save_checkpoint_every'] == 0
                and iteration > 0):
            chainer.config.train = False
            chainer.config.enable_backprop = False
            loader.resetImageIterator('val')
            loss_sum = 0
            loss_generation = 0
            loss_lm_margin = 0
            loss_evals = 0
            accuracy = 0
            rank_acc = 0
            rank_num = 0
            while True:
                data = loader.getImageBatch('val', params)
                image_id = data['image_id']
                img_ann_ids = data['img_ann_ids']
                sent_ids = data['sent_ids']
                gd_ixs = data['gd_ixs']
                feats = Variable(xp.array(data['feats'], dtype=xp.float32))
                sp_cxt_feats = Variable(
                    xp.array(data['sp_cxt_feats'], dtype=xp.float32))
                sp_ann_feats = Variable(
                    xp.array(data['sp_ann_feats'], dtype=xp.float32))
                local_shapes = data['local_shapes']
                seqz = data['seqz']
                lang_last_ind = calc_max_ind(seqz)
                scores = []
                for i, sent_id in enumerate(sent_ids):

                    gd_ix = gd_ixs[i]
                    labels = xp.zeros(len(img_ann_ids), dtype=xp.int32)
                    labels[gd_ix] = 1
                    labels = Variable(labels)

                    sent_seqz = np.concatenate(
                        [[seqz[i]] for _ in range(len(img_ann_ids))], axis=0)
                    one_last_ind = np.array([lang_last_ind[i]] *
                                            len(img_ann_ids))
                    sent_seqz = Variable(xp.array(sent_seqz, dtype=xp.int32))

                    coord = cuda.to_cpu(
                        feats[:,
                              sum(ve.feat_ind[:1]):sum(ve.feat_ind[:2])].data)
                    local_sp_coord, global_sp_coord = calc_coordinate_feature(
                        coord, local_shapes, global_shapes=global_shapes)
                    local_sp_coord, global_sp_coord = xp.array(
                        local_sp_coord,
                        dtype=xp.float32), xp.array(global_sp_coord,
                                                    dtype=xp.float32)
                    vis_enc_feats = ve(feats, sp_cxt_feats, coord)
                    sp_feats, sp_feats_emb = lm.calc_spatial_features(
                        sp_cxt_feats, sp_ann_feats, local_sp_coord,
                        global_sp_coord)

                    vis_feats = vis_enc_feats
                    logprobs = lm(vis_feats, sp_feats, sp_feats_emb, coord,
                                  sent_seqz, one_last_ind).data

                    gd_ix = gd_ixs[i]
                    lm_generation_loss = lm_crits(
                        {
                            'T': logprobs[:, gd_ix, xp.newaxis]
                        }, {
                            'T': one_last_ind[gd_ix, np.newaxis]
                        },
                        params['lm_margin'],
                        vlamda=0,
                        llamda=0).data
                    lm_scores = -computeLosses(logprobs, one_last_ind)
                    lm_margin_loss, pos_sc, max_neg_sc = compute_margin_loss(
                        lm_scores, gd_ix, params['lm_margin'])
                    scores.append(lm_scores[gd_ix])

                    loss_generation += lm_generation_loss
                    loss_lm_margin += lm_margin_loss
                    loss_sum += lm_generation_loss + lm_margin_loss
                    loss_evals += 1
                    if pos_sc > max_neg_sc:
                        accuracy += 1
                if params['dataset'] == 'refgta':
                    rank_a, rank_n = calc_rank_acc(scores, data['rank'])
                    rank_acc += rank_a
                    rank_num += rank_n
                print('{} iter | {}/{} validating acc : {}'.format(
                    iteration, data['bounds']['it_pos_now'],
                    data['bounds']['it_max'], accuracy / loss_evals))

                if data['bounds']['wrapped']:
                    print('validation finished!')
                    fin_val_loss = cuda.to_cpu(loss_sum / loss_evals)
                    loss_generation = cuda.to_cpu(loss_generation / loss_evals)
                    loss_lm_margin = cuda.to_cpu(loss_lm_margin / loss_evals)
                    fin_val_acc = accuracy / loss_evals
                    break
            val_loss_history.append(fin_val_loss)
            val_loss_lm_s_history.append(loss_generation)
            val_loss_lm_l_history.append(loss_lm_margin)
            val_acc_history.append(fin_val_acc)
            if min_val_loss > fin_val_loss:
                print('val loss {} -> {} improved!'.format(
                    min_val_loss, val_loss_history[-1]))
                min_val_loss = fin_val_loss
                serializers.save_hdf5(
                    osp.join(model_dir,
                             params['id'] + params['id2'] + "ve.h5"), ve)
                serializers.save_hdf5(
                    osp.join(model_dir,
                             params['id'] + params['id2'] + "lm.h5"), lm)

            ## graph
            plt.title("accuracy")
            plt.plot(np.arange(len(val_acc_history)),
                     val_acc_history,
                     label="val_accuracy")
            plt.legend()
            plt.savefig(
                os.path.join(graph_dir,
                             params['id'] + params['id2'] + "_joint_acc.png"))
            plt.close()

            plt.title("loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_history,
                     label="all_loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_lm_s_history,
                     label="generation_loss")
            plt.legend()
            plt.savefig(
                os.path.join(graph_dir,
                             params['id'] + params['id2'] + "_joint_loss.png"))
            plt.close()

            plt.title("loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_lm_l_history,
                     label="lm_comp_loss")
            plt.legend()
            plt.savefig(
                os.path.join(
                    graph_dir,
                    params['id'] + params['id2'] + "_joint_comp_loss.png"))
            plt.close()

            if params['dataset'] == 'refgta':
                val_rank_acc_history.append(rank_acc / rank_num)
                plt.title("rank loss")
                plt.plot(np.arange(len(val_rank_acc_history)),
                         val_rank_acc_history,
                         label="rank_acc")
                plt.legend()
                plt.savefig(
                    os.path.join(
                        graph_dir,
                        params['id'] + params['id2'] + "_joint_rank_acc.png"))
                plt.close()

        if iteration > params['learning_rate_decay_start'] and params[
                'learning_rate_decay_start'] >= 0:
            frac = (iteration - params['learning_rate_decay_start']
                    ) / params['learning_rate_decay_every']
            decay_factor = math.pow(0.1, frac)
            ve_optim.alpha *= decay_factor
            lm_optim.alpha *= decay_factor

        iteration += 1
Exemplo n.º 3
0
def train_all(params):
    target_save_dir = osp.join(params['save_dir'], 'prepro',
                               params['dataset'] + '_' + params['splitBy'])
    graph_dir = osp.join('log_graph',
                         params['dataset'] + '_' + params['splitBy'])
    model_dir = osp.join(params['save_dir'], 'model',
                         params['dataset'] + '_' + params['splitBy'])

    if params['old']:
        params['data_json'] = 'old' + params['data_json']
        params['data_h5'] = 'old' + params['data_h5']
        params['image_feats'] = 'old' + params['image_feats']
        params['ann_feats'] = 'old' + params['ann_feats']
        params['id'] = 'old' + params['id']
        params['word_emb_path'] = 'old' + params['word_emb_path']

    with open('setting.json', 'w') as f:
        json.dump(params, f)
    if not osp.isdir(graph_dir):
        os.mkdir(graph_dir)
    loader = DataLoader(params)

    # model setting
    batch_size = params['batch_size']
    gpu_id = params['gpu_id']
    cuda.get_device(gpu_id).use()
    xp = cuda.cupy

    featsOpt = {
        'ann': osp.join(target_save_dir, params['ann_feats']),
        'img': osp.join(target_save_dir, params['image_feats'])
    }
    loader.loadFeats(featsOpt)
    loader.shuffle('train')

    ve = VisualEncoder(res6=L.ResNet152Layers().fc6).to_gpu(gpu_id)
    if 'attention' in params['id']:
        print('attention language encoder')
        le = LanguageEncoderAttn(len(loader.ix_to_word))
        rl_crit = ListenerReward(len(loader.ix_to_word),
                                 attention=True).to_gpu(gpu_id)
    else:
        le = LanguageEncoder(len(loader.ix_to_word))
        rl_crit = ListenerReward(len(loader.ix_to_word),
                                 attention=False).to_gpu(gpu_id)
    cca = CcaEmbedding().to_gpu(gpu_id)
    lm = LanguageModel(len(loader.ix_to_word), loader.seq_length)
    if params['pretrained_w']:
        print('pretrained word embedding...')
        word_emb = load_vcab_init(
            loader.word_to_ix,
            osp.join(target_save_dir, params['word_emb_path']))
        le.word_emb.W.data = word_emb
        lm.word_emb = le.word_emb

    le.to_gpu(gpu_id)
    lm.to_gpu(gpu_id)
    serializers.load_hdf5(osp.join(model_dir, params['id'] + ".h5"), rl_crit)

    ve_optim = optimizers.Adam(alpha=4e-5, beta1=0.8)
    le_optim = optimizers.Adam(alpha=4e-4, beta1=0.8)
    cca_optim = optimizers.Adam(alpha=4e-4, beta1=0.8)
    lm_optim = optimizers.Adam(alpha=4e-4, beta1=0.8)

    ve_optim.setup(ve)
    le_optim.setup(le)
    cca_optim.setup(cca)
    lm_optim.setup(lm)

    ve_optim.add_hook(chainer.optimizer.GradientClipping(0.1))
    le_optim.add_hook(chainer.optimizer.GradientClipping(0.1))
    cca_optim.add_hook(chainer.optimizer.GradientClipping(0.1))
    lm_optim.add_hook(chainer.optimizer.GradientClipping(0.1))
    ve.joint_enc.W.update_rule.hyperparam.alpha = 4e-4
    ve.joint_enc.b.update_rule.hyperparam.alpha = 4e-4

    iteration = 0
    epoch = 0
    val_loss_history = []
    val_loss_lm_s_history = []
    val_loss_lm_l_history = []
    val_loss_l_history = []
    val_acc_history = []
    val_rank_acc_history = []
    min_val_loss = 100
    while True:
        chainer.config.train = True
        chainer.config.enable_backprop = True
        ve.zerograds()
        le.zerograds()
        cca.zerograds()
        lm.zerograds()
        rl_crit.zerograds()

        data = loader.getBatch('train', params)

        ref_ann_ids = data['ref_ann_ids']
        pos_feats = Variable(xp.array(data['feats'], dtype=xp.float32))
        neg_feats = Variable(xp.array(data['neg_feats'], dtype=xp.float32))

        feats = F.concat([pos_feats, neg_feats, pos_feats], axis=0)
        seqz = np.concatenate([data['seqz'], data['seqz'], data['neg_seqz']],
                              axis=0)
        lang_last_ind = calc_max_ind(seqz)
        seqz = Variable(xp.array(seqz, dtype=xp.int32))

        vis_enc_feats = ve(feats)
        lang_enc_feats = le(seqz, lang_last_ind)
        cossim, vis_emb_feats = cca(vis_enc_feats, lang_enc_feats)
        vis_feats = vis_combine(vis_enc_feats, vis_emb_feats)
        logprobs = lm(vis_feats, seqz, lang_last_ind)

        # emb loss
        pairSim, vis_unpairSim, lang_unpairSim = F.split_axis(cossim,
                                                              3,
                                                              axis=0)
        emb_flows = {
            'vis': [pairSim, vis_unpairSim],
            'lang': [pairSim, lang_unpairSim]
        }
        emb_loss = emb_crits(emb_flows, params['emb_margin'])

        # lang loss
        pairP, vis_unpairP, lang_unpairP = F.split_axis(logprobs, 3, axis=1)
        pair_num, _, lang_unpair_num = np.split(lang_last_ind, 3)
        num_labels = {'T': pair_num, 'F': lang_unpair_num}
        lm_flows = {
            'T': pairP,
            'visF': [pairP, vis_unpairP],
            'langF': [pairP, lang_unpairP]
        }
        lm_loss = lm_crits(lm_flows,
                           num_labels,
                           params['lm_margin'],
                           vlamda=params['vis_rank_weight'],
                           llamda=params['lang_rank_weight'])

        # RL loss (pos,pos)のみ
        rl_vis_feats = F.split_axis(vis_feats, 3, axis=0)[0]
        sampled_seq, sample_log_probs = lm.sample(rl_vis_feats)
        sampled_lang_last_ind = calc_max_ind(sampled_seq)
        rl_loss = rl_crit(pos_feats, sampled_seq, sample_log_probs,
                          sampled_lang_last_ind)  #, lm.baseline)

        loss = emb_loss + lm_loss + rl_loss
        print(emb_loss, lm_loss, rl_loss)

        loss.backward()

        ve_optim.update()
        le_optim.update()
        cca_optim.update()
        lm_optim.update()

        if data['bounds']['wrapped']:
            print('one epoch finished!')
            loader.shuffle('train')

        if params['check_sent']:
            sampled_sents = loader.decode_sequence(cuda.to_cpu(sampled_seq),
                                                   sampled_lang_last_ind)
            for i in range(len(sampled_sents)):
                print('sampled sentence : ', ' '.join(sampled_sents[i]))
                print('reward : ', rl_crit.reward[i])

        if iteration % params['losses_log_every'] == 0:
            acc = xp.where(rl_crit.reward > 0.5, 1, 0).mean()
            print('{} iter : train loss {}, acc : {}, reward_mean : {}'.format(
                iteration, loss.data, acc, rl_crit.reward.mean()))

        if iteration % params[
                'mine_hard_every'] == 0 and iteration > 0 and params[
                    'mine_hard']:
            make_graph(ve, cca, loader, 'train', params, xp)

        if (iteration % params['save_checkpoint_every'] == 0
                and iteration > 0):
            chainer.config.train = False
            chainer.config.enable_backprop = False
            loader.resetImageIterator('val')
            loss_sum = 0
            loss_generation = 0
            loss_lm_margin = 0
            loss_emb_margin = 0
            loss_evals = 0
            accuracy = 0
            rank_acc = 0
            rank_num = 0
            while True:
                data = loader.getImageBatch('val', params)
                image_id = data['image_id']
                img_ann_ids = data['img_ann_ids']
                sent_ids = data['sent_ids']
                gd_ixs = data['gd_ixs']
                feats = Variable(xp.array(data['feats'], dtype=xp.float32))
                seqz = data['seqz']
                lang_last_ind = calc_max_ind(seqz)
                scores = []
                for i, sent_id in enumerate(sent_ids):
                    gd_ix = gd_ixs[i]
                    labels = xp.zeros(len(img_ann_ids), dtype=xp.int32)
                    labels[gd_ix] = 1
                    labels = Variable(labels)

                    sent_seqz = np.concatenate(
                        [[seqz[i]] for _ in range(len(img_ann_ids))], axis=0)
                    one_last_ind = np.array([lang_last_ind[i]] *
                                            len(img_ann_ids))
                    sent_seqz = Variable(xp.array(sent_seqz, dtype=xp.int32))

                    vis_enc_feats = ve(feats)
                    lang_enc_feats = le(sent_seqz, one_last_ind)
                    cossim, vis_emb_feats = cca(vis_enc_feats, lang_enc_feats)
                    vis_feats = vis_combine(vis_enc_feats, vis_emb_feats)
                    logprobs = lm(vis_feats, sent_seqz, one_last_ind).data

                    gd_ix = gd_ixs[i]
                    lm_generation_loss = lm_crits(
                        {
                            'T': logprobs[:, gd_ix, xp.newaxis]
                        }, {
                            'T': one_last_ind[gd_ix, np.newaxis]
                        },
                        params['lm_margin'],
                        vlamda=0,
                        llamda=0).data

                    lm_scores = -computeLosses(logprobs, one_last_ind)
                    lm_margin_loss, _, _ = compute_margin_loss(
                        lm_scores, gd_ix, params['lm_margin'])
                    scores.append(lm_scores[gd_ix])

                    emb_margin_loss, pos_sc, max_neg_sc = compute_margin_loss(
                        cossim.data, gd_ix, params['emb_margin'])
                    loss_generation += lm_generation_loss
                    loss_lm_margin += lm_margin_loss
                    loss_emb_margin += emb_margin_loss
                    loss_sum += lm_generation_loss + lm_margin_loss + emb_margin_loss
                    loss_evals += 1
                    if pos_sc > max_neg_sc:
                        accuracy += 1
                if params['dataset'] == 'refgta':
                    rank_a, rank_n = calc_rank_acc(scores, data['rank'])
                    rank_acc += rank_a
                    rank_num += rank_n
                print('{} iter | {}/{} validating acc : {}'.format(
                    iteration, data['bounds']['it_pos_now'],
                    data['bounds']['it_max'], accuracy / loss_evals))

                if data['bounds']['wrapped']:
                    print('validation finished!')
                    fin_val_loss = cuda.to_cpu(loss_sum / loss_evals)
                    loss_generation = cuda.to_cpu(loss_generation / loss_evals)
                    loss_lm_margin = cuda.to_cpu(loss_lm_margin / loss_evals)
                    loss_emb_margin = cuda.to_cpu(loss_emb_margin / loss_evals)
                    fin_val_acc = accuracy / loss_evals
                    break
            val_loss_history.append(fin_val_loss)
            val_loss_lm_s_history.append(loss_generation)
            val_loss_lm_l_history.append(loss_lm_margin)
            val_loss_l_history.append(loss_emb_margin)
            val_acc_history.append(fin_val_acc)
            if min_val_loss > fin_val_loss:
                print('val loss {} -> {} improved!'.format(
                    min_val_loss, val_loss_history[-1]))
                min_val_loss = fin_val_loss
                serializers.save_hdf5(
                    osp.join(model_dir,
                             params['id'] + params['id2'] + "ve.h5"), ve)
                serializers.save_hdf5(
                    osp.join(model_dir,
                             params['id'] + params['id2'] + "le.h5"), le)
                serializers.save_hdf5(
                    osp.join(model_dir,
                             params['id'] + params['id2'] + "cca.h5"), cca)
                serializers.save_hdf5(
                    osp.join(model_dir,
                             params['id'] + params['id2'] + "lm.h5"), lm)

            ## graph
            plt.title("accuracy")
            plt.plot(np.arange(len(val_acc_history)),
                     val_acc_history,
                     label="val_accuracy")
            plt.legend()
            plt.savefig(
                os.path.join(graph_dir,
                             params['id'] + params['id2'] + "_joint_acc.png"))
            plt.close()

            plt.title("loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_history,
                     label="all_loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_lm_s_history,
                     label="generation_loss")
            plt.legend()
            plt.savefig(
                os.path.join(graph_dir,
                             params['id'] + params['id2'] + "_joint_loss.png"))
            plt.close()

            plt.title("loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_lm_l_history,
                     label="lm_comp_loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_l_history,
                     label="comp_loss")
            plt.legend()
            plt.savefig(
                os.path.join(
                    graph_dir,
                    params['id'] + params['id2'] + "_joint_comp_loss.png"))
            plt.close()

            if params['dataset'] == 'refgta':
                print(rank_num)
                val_rank_acc_history.append(rank_acc / rank_num)
                plt.title("rank loss")
                plt.plot(np.arange(len(val_rank_acc_history)),
                         val_rank_acc_history,
                         label="rank_acc")
                plt.legend()
                plt.savefig(
                    os.path.join(
                        graph_dir,
                        params['id'] + params['id2'] + "_rank_acc.png"))
                plt.close()

        if iteration > params['learning_rate_decay_start'] and params[
                'learning_rate_decay_start'] >= 0:
            frac = (iteration - params['learning_rate_decay_start']
                    ) / params['learning_rate_decay_every']
            decay_factor = math.pow(0.1, frac)
            ve_optim.alpha *= decay_factor
            le_optim.alpha *= decay_factor
            cca_optim.alpha *= decay_factor
            lm_optim.alpha *= decay_factor

        iteration += 1
Exemplo n.º 4
0
def eval_all(params):
    target_save_dir = osp.join(params['save_dir'], 'prepro',
                               params['dataset'] + '_' + params['splitBy'])
    model_dir = osp.join(params['save_dir'], 'model',
                         params['dataset'] + '_' + params['splitBy'])
    result_dir = osp.join('result',
                          params['dataset'] + '_' + params['splitBy'])

    if not osp.isdir(result_dir):
        os.makedirs(result_dir)

    if params['old']:
        params['data_json'] = 'old' + params['data_json']
        params['data_h5'] = 'old' + params['data_h5']
        params['image_feats_h5'] = 'old' + params['image_feats_h5']
        params['ann_feats_h5'] = 'old' + params['ann_feats_h5']
        params['id'] = 'old' + params['id']

    if params['dataset'] in ['refcoco', 'refcoco+', 'refcocog']:
        global_shapes = (224, 224)
    elif params['dataset'] == 'refgta':
        global_shapes = (480, 288)

    loader = DataLoader(params)

    featsOpt = {
        'sp_ann': osp.join(target_save_dir, params['sp_ann_feats']),
        'ann_input': osp.join(target_save_dir, params['ann_feats']),
        'img': osp.join(target_save_dir, params['image_feats']),
        'shapes': osp.join(target_save_dir, params['ann_shapes'])
    }
    loader.loadFeats(featsOpt)
    chainer.config.train = False
    chainer.config.enable_backprop = False

    gpu_id = params['gpu_id']
    cuda.get_device(gpu_id).use()
    xp = cuda.cupy

    ve = VisualEncoder(global_shapes=global_shapes).to_gpu(gpu_id)
    lm = LanguageModel(len(loader.ix_to_word), loader.seq_length,
                       global_shapes).to_gpu(gpu_id)

    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "ve.h5"), ve)
    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "lm.h5"), lm)

    predictions = []
    beam_all_results = []
    while True:
        data = loader.getTestBatch(params['split'], params)
        ref_ids = data['ref_ids']
        lang_last_ind = calc_max_ind(data['seqz'])
        feats = Variable(xp.array(data['feats'], dtype=xp.float32))
        sp_cxt_feats = Variable(
            xp.array(data['sp_cxt_feats'], dtype=xp.float32))
        sp_ann_feats = Variable(
            xp.array(data['sp_ann_feats'], dtype=xp.float32))
        local_shapes = data['local_shapes']
        coord = data['feats'][:, sum(ve.feat_ind[:1]):sum(ve.feat_ind[:2])]
        local_sp_coord, global_sp_coord = calc_coordinate_feature(
            coord, local_shapes, global_shapes=global_shapes)
        local_sp_coord, global_sp_coord = xp.array(local_sp_coord,
                                                   dtype=xp.float32), xp.array(
                                                       global_sp_coord,
                                                       dtype=xp.float32)

        vis_enc_feats = ve(feats, sp_cxt_feats, coord)
        vis_feats = vis_enc_feats
        sp_feats, sp_feats_emb = lm.calc_spatial_features(
            sp_cxt_feats, sp_ann_feats, local_sp_coord, global_sp_coord)
        if params['beam_width'] == 1:
            results = lm.max_sample(vis_feats)
        else:
            beam_results, _ = beam_search(lm, vis_feats, sp_feats,
                                          sp_feats_emb, coord,
                                          params['beam_width'])

            results = [result[0]['sent'] for result in beam_results]
            ppls = [result[0]['ppl'] for result in beam_results]

        for i, result in enumerate(results):
            gen_sentence = ' '.join(
                [loader.ix_to_word[str(w)] for w in result])
            if params['beam_width'] == 1:
                print(gen_sentence)
            else:
                print(gen_sentence, ', ppl : ', ppls[i])
            entry = {'ref_id': ref_ids[i], 'sent': gen_sentence}
            predictions.append(entry)
            if params['beam_width'] > 1:
                beam_all_results.append({
                    'ref_id': ref_ids[i],
                    'beam': beam_results[i]
                })
        print('evaluating validation performance... {}/{}'.format(
            data['bounds']['it_pos_now'], data['bounds']['it_max']))

        if data['bounds']['wrapped']:
            print('validation finished!')
            break
    lang_stats = language_eval(predictions, params['split'], params)
    print(lang_stats)

    print('sentence mean length: ',
          np.mean([len(pred['sent'].split()) for pred in predictions]))
    with open(
            result_dir + '/' + params['id'] + params['id2'] +
            str(params['beam_width']) + params['split'] + 'raw.json',
            'w') as f:
        json.dump(predictions, f)
    with open(
            result_dir + '/' + params['id'] + params['id2'] +
            str(params['beam_width']) + params['split'] + '.json', 'w') as f:
        json.dump(lang_stats, f)
    with open(
            result_dir + '/' + params['id'] + params['id2'] +
            str(params['beam_width']) + params['split'] + 'all_beam.json',
            'w') as f:
        json.dump(beam_all_results, f)
Exemplo n.º 5
0
def eval_all(params):
    target_save_dir = osp.join(params['save_dir'], 'prepro',
                               params['dataset'] + '_' + params['splitBy'])
    model_dir = osp.join(params['save_dir'], 'model',
                         params['dataset'] + '_' + params['splitBy'])

    if params['old']:
        params['data_json'] = 'old' + params['data_json']
        params['data_h5'] = 'old' + params['data_h5']
        params['image_feats'] = 'old' + params['image_feats']
        params['ann_feats'] = 'old' + params['ann_feats']
        params['id'] = 'old' + params['id']

    loader = DataLoader(params)

    featsOpt = {
        'ann': osp.join(target_save_dir, params['ann_feats']),
        'img': osp.join(target_save_dir, params['image_feats'])
    }
    loader.loadFeats(featsOpt)
    chainer.config.train = False
    chainer.config.enable_backprop = False

    gpu_id = params['gpu_id']
    cuda.get_device(gpu_id).use()
    xp = cuda.cupy

    if 'attention' in params['id']:
        print('attn')
        le = LanguageEncoderAttn(len(loader.ix_to_word)).to_gpu(gpu_id)
    else:
        le = LanguageEncoder(len(loader.ix_to_word)).to_gpu(gpu_id)
    ve = VisualEncoder().to_gpu(gpu_id)
    cca = CcaEmbedding().to_gpu(gpu_id)
    lm = LanguageModel(len(loader.ix_to_word),
                       loader.seq_length).to_gpu(gpu_id)

    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "ve.h5"), ve)
    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "le.h5"), le)
    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "cca.h5"), cca)
    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "lm.h5"), lm)

    predictions = []
    beam_all_results = []
    while True:
        data = loader.getTestBatch(params['split'], params)
        ref_ids = data['ref_ids']
        image_id = data['image_id']
        lang_last_ind = calc_max_ind(data['seqz'])
        feats = Variable(xp.array(data['feats'], dtype=xp.float32))
        vis_enc_feats = ve(feats)
        lang_enc_feats = vis_enc_feats  ##fake
        _, vis_emb_feats = cca(vis_enc_feats, lang_enc_feats)
        vis_feats = vis_combine(vis_enc_feats, vis_emb_feats)

        if params['beam_width'] == 1:
            results = lm.max_sample(vis_feats)
        else:
            beam_results = beam_search(lm, vis_feats, params['beam_width'])
            results = [result[0]['sent'] for result in beam_results]
            ppls = [result[0]['ppl'] for result in beam_results]

        for i, result in enumerate(results):
            gen_sentence = ' '.join(
                [loader.ix_to_word[str(w)] for w in result])
            if params['beam_width'] == 1:
                print(gen_sentence)
            else:
                print(gen_sentence, 'image_id : ', image_id)
            entry = {'ref_id': ref_ids[i], 'sent': gen_sentence}
            predictions.append(entry)
            if params['beam_width'] > 1:
                beam_all_results.append({
                    'ref_id': ref_ids[i],
                    'beam': beam_results[i]
                })
        print('evaluating validation performance... {}/{}'.format(
            data['bounds']['it_pos_now'], data['bounds']['it_max']))

        if data['bounds']['wrapped']:
            print('validation finished!')
            break
    lang_stats = language_eval(predictions, params['split'], params)
    print(lang_stats)
Exemplo n.º 6
0
def eval_all(params):
    target_save_dir = osp.join(params['save_dir'],'prepro', params['dataset']+'_'+params['splitBy'])
    model_dir = osp.join(params['save_dir'],'model', params['dataset']+'_'+params['splitBy'])
    
    if params['old'] and params['dataset'] in ['refcoco','refcoco+','refcocog']:
        params['data_json'] = 'old'+params['data_json']
        params['data_h5'] = 'old'+params['data_h5']
        params['image_feats'] = 'old'+params['image_feats']
        params['ann_feats'] = 'old'+params['ann_feats']
        params['id'] = 'old'+params['id']
        
    loader = DataLoader(params)
    
    featsOpt = {'ann':osp.join(target_save_dir, params['ann_feats']),
                'img':osp.join(target_save_dir, params['image_feats'])}
    loader.loadFeats(featsOpt) 
    chainer.config.train = False
    chainer.config.enable_backprop = False
    
    gpu_id = params['gpu_id']
    cuda.get_device(gpu_id).use()
    xp = cuda.cupy
    
    ve = VisualEncoder().to_gpu(gpu_id)
    if 'attention' in params['id']:
        print('attn')
        le = LanguageEncoderAttn(len(loader.ix_to_word)).to_gpu(gpu_id)
    else:
        le = LanguageEncoder(len(loader.ix_to_word)).to_gpu(gpu_id)
    cca = CcaEmbedding().to_gpu(gpu_id)
    lm  = LanguageModel(len(loader.ix_to_word), loader.seq_length).to_gpu(gpu_id)
    
    serializers.load_hdf5(osp.join(model_dir, params['id']+params['id2']+"ve.h5"), ve)
    serializers.load_hdf5(osp.join(model_dir, params['id']+params['id2']+"le.h5"), le)
    serializers.load_hdf5(osp.join(model_dir, params['id']+params['id2']+"cca.h5"), cca)
    serializers.load_hdf5(osp.join(model_dir, params['id']+params['id2']+"lm.h5"), lm)
    
    accuracy = 0
    loss_evals  = 0
    while True:
        data = loader.getImageBatch(params['split'], params)
        image_id = data['image_id']
        img_ann_ids = data['img_ann_ids']
        sent_ids = data['sent_ids']
        gd_ixs = data['gd_ixs']
        feats = Variable(xp.array(data['feats'], dtype=xp.float32))
        seqz = data['seqz']
        lang_last_ind = calc_max_ind(seqz)
        for i, sent_id in enumerate(sent_ids):
            gd_ix = gd_ixs[i]
            labels = xp.zeros(len(img_ann_ids), dtype=xp.int32)
            labels[gd_ix] = 1
            labels = Variable(labels)

            sent_seqz = np.concatenate([[seqz[i]] for _ in range(len(img_ann_ids))],axis=0)
            one_last_ind =  np.array([lang_last_ind[i]]*len(img_ann_ids))
            sent_seqz = Variable(xp.array(sent_seqz, dtype=xp.int32))
                
            vis_enc_feats = ve(feats)
            lang_enc_feats = le(sent_seqz, one_last_ind)
            cossim, vis_emb_feats = cca(vis_enc_feats, lang_enc_feats)
            vis_feats = vis_combine(vis_enc_feats, vis_emb_feats)
            logprobs = lm(vis_feats, sent_seqz, one_last_ind).data
            
            lm_scores = -computeLosses(logprobs, one_last_ind)  
            
            if params['mode']==0:
                _, pos_sc, max_neg_sc = compute_margin_loss(lm_scores, gd_ix, 0)
            elif params['mode']==1:
                _, pos_sc, max_neg_sc = compute_margin_loss(cossim.data, gd_ix, 0)
            elif params['mode']==2:
                scores = cossim.data + params['lamda'] * lm_scores
                _, pos_sc, max_neg_sc = compute_margin_loss(scores, gd_ix, 0)
            if pos_sc > max_neg_sc:
                accuracy += 1
            loss_evals += 1
            print('{}-th: evaluating [{}]  ... image[{}/{}] sent[{}], acc={}'.format(loss_evals, params['split'], data['bounds']['it_pos_now'], data['bounds']['it_max'], i, accuracy*100.0/loss_evals))
        
        if data['bounds']['wrapped']:
            print('validation finished!')
            f = open('result/'+params['dataset']+params['split']+params['id']+str(params['mode'])+str(params['lamda'])+'comp.txt', 'w') # 書き込みモードで開く
            f.write(str(accuracy*100.0/loss_evals)) # 引数の文字列をファイルに書き込む
            f.close() 
            break
Exemplo n.º 7
0
def train_vl(params):
    target_save_dir = osp.join(params['save_dir'], 'prepro',
                               params['dataset'] + '_' + params['splitBy'])
    graph_dir = osp.join('log_graph',
                         params['dataset'] + '_' + params['splitBy'])
    model_dir = osp.join(params['save_dir'], 'model',
                         params['dataset'] + '_' + params['splitBy'])
    if not osp.isdir(graph_dir):
        os.makedirs(graph_dir)
    if not osp.isdir(model_dir):
        os.makedirs(model_dir)

    if params['old']:
        params['data_json'] = 'old' + params['data_json']
        params['data_h5'] = 'old' + params['data_h5']
        params['image_feats'] = 'old' + params['image_feats']
        params['ann_feats'] = 'old' + params['ann_feats']
        params['id'] = 'old' + params['id']
        params['word_emb_path'] = 'old' + params['word_emb_path']

    loader = DataLoader(params)

    featsOpt = {
        'ann': osp.join(target_save_dir, params['ann_feats']),
        'img': osp.join(target_save_dir, params['image_feats'])
    }
    loader.loadFeats(featsOpt)
    loader.shuffle('train')

    # model setting
    batch_size = params['batch_size']
    gpu_id = params['gpu_id']
    seq_per_ref = params['seq_per_ref']
    cuda.get_device(gpu_id).use()
    xp = cuda.cupy

    ve = VisualEncoder(res6=L.ResNet152Layers().fc6).to_gpu(gpu_id)
    if 'attention' in params['id']:
        print('attention language encoder')
        le = LanguageEncoderAttn(len(loader.ix_to_word))
        save_model = ListenerReward(len(loader.ix_to_word), attention=True)
    else:
        le = LanguageEncoder(len(loader.ix_to_word))
        save_model = ListenerReward(len(loader.ix_to_word), attention=False)

    if params['pretrained_w']:
        print('pretrained word embedding...')
        word_emb = load_vcab_init(
            loader.word_to_ix,
            osp.join(target_save_dir, params['word_emb_path']))
        le.word_emb.W.data = word_emb
    le.to_gpu(gpu_id)
    me = MetricNet().to_gpu(gpu_id)

    ve_optim = optimizers.Adam(alpha=4e-5, beta1=0.8)
    le_optim = optimizers.Adam(alpha=4e-4, beta1=0.8)
    me_optim = optimizers.Adam(alpha=4e-4, beta1=0.8)
    ve_optim.setup(ve)
    le_optim.setup(le)
    me_optim.setup(me)

    ve_optim.add_hook(chainer.optimizer.GradientClipping(0.1))
    le_optim.add_hook(chainer.optimizer.GradientClipping(0.1))
    me_optim.add_hook(chainer.optimizer.GradientClipping(0.1))
    ve.joint_enc.W.update_rule.hyperparam.alpha = 4e-4
    ve.joint_enc.b.update_rule.hyperparam.alpha = 4e-4

    iteration = 0
    epoch = 0
    val_loss_history = []
    val_acc_history = []
    val_rank_acc_history = []
    min_val_loss = 100
    max_acc = 0
    while True:
        chainer.config.train = True
        chainer.config.enable_backprop = True
        ve.zerograds()
        le.zerograds()
        me.zerograds()
        data = loader.getBatch('train', params)
        ref_ann_ids = data['ref_ann_ids']

        pos_feats = Variable(xp.array(data['feats'], dtype=xp.float32))
        neg_feats = Variable(xp.array(data['neg_feats'], dtype=xp.float32))
        feats = F.concat([pos_feats, neg_feats, pos_feats], axis=0)

        seqz = np.concatenate([data['seqz'], data['seqz'], data['neg_seqz']],
                              axis=0)
        lang_last_ind = calc_max_ind(seqz)
        seqz = Variable(xp.array(seqz, dtype=xp.int32))
        labels = Variable(
            xp.concatenate([
                xp.ones((batch_size * seq_per_ref)),
                xp.zeros((batch_size * seq_per_ref)),
                xp.zeros((batch_size * seq_per_ref))
            ]).astype(xp.int32))

        vis_enc_feats = ve(feats)
        lang_enc_feats = le(seqz, lang_last_ind)
        score = me(vis_enc_feats, lang_enc_feats).reshape(labels.shape)

        loss = F.sigmoid_cross_entropy(score, labels)
        loss.backward()
        ve_optim.update()
        le_optim.update()
        me_optim.update()

        if data['bounds']['wrapped']:
            print('{} epoch finished!'.format(epoch))
            loader.shuffle('train')
            epoch += 1

        if iteration % params['losses_log_every'] == 0:
            print('{} iter ({} epoch): train loss {}'.format(
                iteration, epoch, loss.data))

        ## validation
        if (iteration % params['save_checkpoint_every'] == 0
                and iteration > 0):
            chainer.config.train = False
            chainer.config.enable_backprop = False
            loader.resetImageIterator('val')
            loss_sum = 0
            loss_evals = 0
            accuracy = 0
            rank_acc = 0
            rank_num = 0
            while True:
                data = loader.getImageBatch('val', params)
                image_id = data['image_id']
                img_ann_ids = data['img_ann_ids']
                sent_ids = data['sent_ids']
                gd_ixs = data['gd_ixs']
                feats = Variable(xp.array(data['feats'], dtype=xp.float32))
                seqz = data['seqz']
                scores = []
                for i, sent_id in enumerate(sent_ids):
                    ## image内の全ての候補領域とscoreを算出する
                    gd_ix = gd_ixs[i]
                    labels = xp.zeros(len(img_ann_ids), dtype=xp.int32)
                    labels[gd_ix] = 1
                    labels = Variable(labels)

                    sent_seqz = np.concatenate(
                        [[seqz[i]] for _ in range(len(img_ann_ids))], axis=0)
                    lang_last_ind = calc_max_ind(sent_seqz)
                    sent_seqz = Variable(xp.array(sent_seqz, dtype=xp.int32))

                    vis_enc_feats = ve(feats)
                    lang_enc_feats = le(sent_seqz, lang_last_ind)
                    score = me(vis_enc_feats,
                               lang_enc_feats).reshape(labels.shape)
                    loss = F.sigmoid_cross_entropy(score, labels)
                    scores.append(score[gd_ix].data)

                    loss_sum += loss.data
                    loss_evals += 1
                    _, pos_sc, max_neg_sc = compute_margin_loss(
                        score.data, gd_ix, 0)
                    if pos_sc > max_neg_sc:
                        accuracy += 1

                if params['dataset'] == 'refgta':
                    rank_a, rank_n = calc_rank_acc(scores, data['rank'])
                    rank_acc += rank_a
                    rank_num += rank_n
                print('{} iter | {}/{} validating acc : {}'.format(
                    iteration, data['bounds']['it_pos_now'],
                    data['bounds']['it_max'], accuracy / loss_evals))

                if data['bounds']['wrapped']:
                    print('validation finished!')
                    fin_val_loss = cuda.to_cpu(loss_sum / loss_evals)
                    fin_val_acc = accuracy / loss_evals
                    break
            val_loss_history.append(fin_val_loss)
            val_acc_history.append(fin_val_acc)
            if min_val_loss > fin_val_loss:
                print('val loss {} -> {} improved!'.format(
                    min_val_loss, val_loss_history[-1]))
                min_val_loss = fin_val_loss

            if max_acc < fin_val_acc:
                max_acc = fin_val_acc
                save_model.ve = ve
                save_model.le = le
                save_model.me = me
                serializers.save_hdf5(
                    osp.join(model_dir, params['id'] + ".h5"), save_model)

            ## graph
            plt.title("accuracy")
            plt.plot(np.arange(len(val_acc_history)),
                     val_acc_history,
                     label="val_accuracy")
            plt.legend()
            plt.savefig(os.path.join(graph_dir, params['id'] + "_acc.png"))
            plt.close()

            plt.title("loss")
            plt.plot(np.arange(len(val_loss_history)),
                     val_loss_history,
                     label="val_loss")
            plt.legend()
            plt.savefig(os.path.join(graph_dir, params['id'] + "_loss.png"))
            plt.close()

            if params['dataset'] == 'refgta':
                print(rank_num)
                val_rank_acc_history.append(rank_acc / rank_num)
                plt.title("rank loss")
                plt.plot(np.arange(len(val_rank_acc_history)),
                         val_rank_acc_history,
                         label="rank_acc")
                plt.legend()
                plt.savefig(
                    os.path.join(graph_dir, params['id'] + "_rank_acc.png"))
                plt.close()

        # learning rate decay
        if iteration > params['learning_rate_decay_start'] and params[
                'learning_rate_decay_start'] >= 0:
            frac = (iteration - params['learning_rate_decay_start']
                    ) / params['learning_rate_decay_every']
            decay_factor = math.pow(0.1, frac)
            ve_optim.alpha *= decay_factor
            le_optim.alpha *= decay_factor
            me_optim.alpha *= decay_factor

        iteration += 1
Exemplo n.º 8
0
def eval_all(params):
    target_save_dir = osp.join(params['save_dir'], 'prepro',
                               params['dataset'] + '_' + params['splitBy'])
    model_dir = osp.join(params['save_dir'], 'model',
                         params['dataset'] + '_' + params['splitBy'])
    result_dir = osp.join('result',
                          params['dataset'] + '_' + params['splitBy'])

    if not osp.isdir(result_dir):
        os.makedirs(result_dir)

    if params['old']:
        params['data_json'] = 'old' + params['data_json']
        params['data_h5'] = 'old' + params['data_h5']
        params['image_feats_h5'] = 'old' + params['image_feats']
        params['ann_feats_h5'] = 'old' + params['ann_feats']
        params['ann_feats_input'] = 'old' + params['ann_feats_input']
        params['shapes'] = 'old' + params['shapes']
        params['id'] = 'old' + params['id']

    if params['dataset'] in ['refcoco', 'refcoco+', 'refcocog']:
        global_shapes = (224, 224)
    elif params['dataset'] == 'refgta':
        global_shapes = (480, 288)
    loader = DataLoader(params)

    featsOpt = {
        'sp_ann': osp.join(target_save_dir, params['sp_ann_feats']),
        'ann_input': osp.join(target_save_dir, params['ann_feats']),
        'img': osp.join(target_save_dir, params['image_feats']),
        'shapes': osp.join(target_save_dir, params['ann_shapes'])
    }
    loader.loadFeats(featsOpt)
    chainer.config.train = False
    chainer.config.enable_backprop = False

    gpu_id = params['gpu_id']
    cuda.get_device(gpu_id).use()
    xp = cuda.cupy

    ve = VisualEncoder(global_shapes=global_shapes).to_gpu(gpu_id)
    rl_crit = ListenerReward(len(loader.ix_to_word),
                             global_shapes=global_shapes).to_gpu(gpu_id)
    lm = LanguageModel(len(loader.ix_to_word), loader.seq_length,
                       global_shapes).to_gpu(gpu_id)

    serializers.load_hdf5(osp.join(model_dir, params['id'] + ".h5"), rl_crit)

    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "ve.h5"), ve)
    serializers.load_hdf5(
        osp.join(model_dir, params['id'] + params['id2'] + "lm.h5"), lm)

    accuracy = 0
    loss_evals = 0
    while True:
        data = loader.getImageBatch(params['split'], params)
        image_id = data['image_id']
        img_ann_ids = data['img_ann_ids']
        sent_ids = data['sent_ids']
        gd_ixs = data['gd_ixs']
        feats = Variable(xp.array(data['feats'], dtype=xp.float32))
        sp_cxt_feats = Variable(
            xp.array(data['sp_cxt_feats'], dtype=xp.float32))
        sp_ann_feats = Variable(
            xp.array(data['sp_ann_feats'], dtype=xp.float32))
        local_shapes = data['local_shapes']
        seqz = data['seqz']
        lang_last_ind = calc_max_ind(seqz)
        for i, sent_id in enumerate(sent_ids):
            gd_ix = gd_ixs[i]
            labels = xp.zeros(len(img_ann_ids), dtype=xp.int32)
            labels[gd_ix] = 1
            labels = Variable(labels)

            sent_seqz = np.concatenate([[seqz[i]]
                                        for _ in range(len(img_ann_ids))],
                                       axis=0)
            one_last_ind = np.array([lang_last_ind[i]] * len(img_ann_ids))
            sent_seqz = Variable(xp.array(sent_seqz, dtype=xp.int32))

            coord = cuda.to_cpu(
                feats[:, sum(ve.feat_ind[:1]):sum(ve.feat_ind[:2])].data)
            local_sp_coord, global_sp_coord = calc_coordinate_feature(
                coord, local_shapes, global_shapes=global_shapes)
            local_sp_coord, global_sp_coord = xp.array(
                local_sp_coord, dtype=xp.float32), xp.array(global_sp_coord,
                                                            dtype=xp.float32)
            vis_enc_feats = ve(feats, sp_cxt_feats, coord)
            sp_feats, sp_feats_emb = lm.calc_spatial_features(
                sp_cxt_feats, sp_ann_feats, local_sp_coord, global_sp_coord)
            vis_feats = vis_enc_feats
            logprobs = lm(vis_feats, sp_feats, sp_feats_emb, coord, sent_seqz,
                          one_last_ind).data

            lm_scores = -cuda.to_cpu(computeLosses(logprobs, one_last_ind))

            score = cuda.to_cpu(
                F.sigmoid(
                    rl_crit.calc_score(feats, sp_cxt_feats, coord, sent_seqz,
                                       one_last_ind)).data)[:, 0]

            if params['mode'] == 0:
                _, pos_sc, max_neg_sc = compute_margin_loss(
                    lm_scores, gd_ix, 0)
            elif params['mode'] == 1:
                _, pos_sc, max_neg_sc = compute_margin_loss(score, gd_ix, 0)
            elif params['mode'] == 2:
                scores = score + params['lamda'] * lm_scores
                _, pos_sc, max_neg_sc = compute_margin_loss(scores, gd_ix, 0)
            if pos_sc > max_neg_sc:
                accuracy += 1
            loss_evals += 1
            print('{}-th: evaluating [{}]  ... image[{}/{}] sent[{}], acc={}'.
                  format(loss_evals, params['split'],
                         data['bounds']['it_pos_now'],
                         data['bounds']['it_max'], i,
                         accuracy * 100.0 / loss_evals))

        if data['bounds']['wrapped']:
            print('validation finished!')
            f = open(
                result_dir + '/' + params['id'] + params['id2'] +
                str(params['mode']) + str(params['lamda']) + 'comp.txt', 'w')
            f.write(str(accuracy * 100.0 / loss_evals))
            f.close()
            break