Exemple #1
0
def get_product_scores(args):
    # Prepare data.
    print("Reading data in %s" % args.data_dir)

    ranklist_dir = "%s/ranklist" % (args.save_dir)
    if not os.path.isdir(ranklist_dir):
        os.makedirs(ranklist_dir)
    data_set = data_util.upsearch_data(args.data_dir,
                                       args.input_train_dir,
                                       'test',
                                       args.batch_size,
                                       args.model_net_struct,
                                       args.threshold,
                                       is_av_embed_shared=args.share_av_emb)
    # Create model.
    orig_init_learning_rate = args.init_learning_rate
    model, optimizer = create_model(args, data_set)
    model.eval()
    #for dropout
    current_step = 0
    user_ranklist_map = colls.defaultdict(list)
    user_ranklist_score_map = colls.defaultdict(list)
    print('Start Testing')
    data_set.setup_data_set(0)
    data_set.initialize_test_iter()
    data_set.prepare_test_epoch()
    data_set.read_train_product_ids(args.input_train_dir)
    has_next = True
    while has_next:
        user_idxs, query_idxs, query_word_idxs, has_next = data_set.get_test_batch(
        )
        if len(user_idxs) == 0:
            break
        #product_idxs can be refined to a candidate set

        user_product_scores = model.get_product_scores(user_idxs,
                                                       query_word_idxs,
                                                       product_idxs=None)
        current_step += 1
        #batch_size, product_size
        # record the results
        store_sorted_ranklist(data_set, args.rank_cutoff, \
            user_ranklist_map, user_ranklist_score_map,
            user_product_scores, user_idxs, query_idxs,
            args.keep_first_rel_qu, product_idxs = None)

        if current_step % args.steps_per_checkpoint == 0:
            print("Finish test qu %d/%d\r" %
                  (data_set.cur_uqr_i, len(data_set.test_seq)),
                  end="")

    fname_arr = [args.model_net_struct, args.similarity_func]
    fname_arr += ["bz%d" % args.batch_size, args.optimizer]
    if args.L2_lambda > 0.:
        fname_arr.append("%.0E" % Decimal(args.L2_lambda))
    fname_arr += [
        "lr%.4f" % orig_init_learning_rate,
        "subs%.0E" % Decimal(args.subsampling_rate)
    ]
    fname_arr += ["qw%.1f" % args.query_weight, "emb%d" % args.embed_size]
    if args.scale_grad:
        fname_arr += ["scale%s" % args.scale_grad]
    fname_arr += [
        "sparse%s" % args.sparse_emb,
        "firstkept%s.ckpt" % args.keep_first_rel_qu
    ]
    fname = '_'.join(fname_arr)

    data_set.output_ranklist(user_ranklist_map, user_ranklist_score_map,
                             ranklist_dir, fname)
    print("first relevant skipped qu:", data_set.skip_store_rank_count)
Exemple #2
0
def get_product_scores_av(args):
    # Prepare data.
    print("Reading data in %s" % args.data_dir)

    data_set = data_util.upsearch_data(
        args.data_dir,
        args.input_train_dir,
        'test',
        args.batch_size,
        args.model_net_struct,
        args.threshold,
        is_av_embed_shared=args.share_av_emb,
        is_feedback_same_user=args.is_feedback_same_user,
        neg_per_pos=args.neg_per_pos,
        keep_feedback_type=args.keep_feedback_type,  #"pos", "neg"
        feedback_user_model=args.feedback_user_model,  #ra, fa, rv, fv
        max_av_count=args.av_count_per_iter,
        info_level=args.info_level)
    #get q-u pair both with av and without av, the total number of which is args.batch_size
    # Create model.
    ranklist_dir = "%s/ranklist" % (args.save_dir)
    if not os.path.isdir(ranklist_dir):
        os.makedirs(ranklist_dir)
    orig_init_learning_rate = args.init_learning_rate
    model, optimizer = create_model(args, data_set)
    model.eval()
    model.init_aspect_vecs_for_test()
    #for dropout
    current_step = 0
    user_ranklist_map = colls.defaultdict(list)
    user_ranklist_score_map = colls.defaultdict(list)
    print('Start Testing')
    start_time = time.time()
    #data_set.setup_data_set(0)
    data_set.prepare_test_epoch()
    data_set.read_train_product_ids(args.input_train_dir)
    torch.set_grad_enabled(False)  #do not require grad
    for cur_iter_i in xrange(1, args.iter_count + 1):
        data_set.initialize_test_iter()
        has_next = True
        qu_count = 0
        apaired_qu_count = 0
        while has_next:
            product_idxs = None
            av_product_idxs = None
            user_idxs, query_idxs, query_word_idxs, \
            av_user_idxs, av_query_idxs, av_query_word_idxs, query_av_pairs, has_next \
                = data_set.get_av_test_batch(user_ranklist_map, cur_iter_i)
            qu_count += len(user_idxs)
            apaired_qu_count += len(av_user_idxs)

            if len(user_idxs) == 0 and len(av_user_idxs) == 0:
                break
            if len(user_idxs) > 0:
                user_product_scores = model.get_product_scores(
                    user_idxs, query_word_idxs, product_idxs=None)
                store_sorted_ranklist(data_set, args.rank_cutoff, \
                    user_ranklist_map, user_ranklist_score_map,
                    user_product_scores, user_idxs, query_idxs,
                    args.keep_first_rel_qu,
                    cur_iter = cur_iter_i, product_idxs = None)

            if len(av_user_idxs) > 0:
                user_av_product_scores = model.get_product_scores_av(
                    av_user_idxs,
                    av_query_word_idxs,
                    query_av_pairs,
                    product_idxs=av_product_idxs)
                store_sorted_ranklist(data_set, args.rank_cutoff, \
                    user_ranklist_map, user_ranklist_score_map,
                    user_av_product_scores, av_user_idxs, av_query_idxs,
                    args.keep_first_rel_qu,
                    cur_iter = cur_iter_i, product_idxs = None)
                #print("len(av_user_idx)", len(av_user_idxs))
            current_step += 1
            #batch_size, product_size

            # record the results
            #if current_step % args.steps_per_checkpoint == 0:
            if current_step % 10 == 0:
                print("Finish test qu %d/%d" %
                      (data_set.cur_uqr_i, len(data_set.test_seq)),
                      end="")
        print("Iter%d qu_count:%d apaired_qu_count:%d" %
              (cur_iter_i, qu_count, apaired_qu_count))

        fname_arr = [
            args.model_net_struct, args.similarity_func, args.comb_net_struct
        ]
        fname_arr += ["bz%d" % args.batch_size, args.optimizer]
        if args.L2_lambda > 0.:
            fname_arr.append("%.0E" % Decimal(args.L2_lambda))
        fname_arr += [
            "lr%.4f" % orig_init_learning_rate,
            "subs%.0E" % Decimal(args.subsampling_rate)
        ]
        fname_arr += ["a%s" % args.aspect_prob_type, args.value_loss_func]
        fname_arr += ["qw%.1f" % args.query_weight, "emb%d" % args.embed_size]
        if args.scale_grad:
            fname_arr += ["scale%s" % args.scale_grad]
        fname_arr += [
            "lh%s" % args.likelihood_way,
            "sparse%s%s" % (args.sparse_emb, args.loss_ablation)
        ]
        fname_arr += [
            "info%d" % args.info_level, "sameu",
            str(args.is_feedback_same_user)
        ]
        fname_arr += [
            "firstkept%s" % args.keep_first_rel_qu, args.keep_feedback_type
        ]
        fname_arr += ["avcount%d" % args.av_count_per_iter]
        fname_arr += ["%siter%d.ckpt" % (args.feedback_user_model, cur_iter_i)]
        fname = '_'.join(fname_arr)

        data_set.output_ranklist(user_ranklist_map, user_ranklist_score_map,
                                 ranklist_dir, fname)
        print("first relevant skipped qu:", data_set.skip_store_rank_count)
        print("QU updated in this iter:", len(data_set.test_user_query_set))
Exemple #3
0
def train(args):
    print("Reading data in %s" % args.data_dir)
    args.start_epoch = 0

    data_set = data_util.upsearch_data(
        args.data_dir,
        args.input_train_dir,
        'train',
        args.batch_size,
        args.model_net_struct,
        args.threshold,
        is_av_embed_shared=args.share_av_emb,
        is_feedback_same_user=args.is_feedback_same_user,
        neg_per_pos=args.neg_per_pos)

    data_set.sub_sampling(args.subsampling_rate)
    orig_init_learning_rate = args.init_learning_rate
    learning_rate = orig_init_learning_rate
    model, optimizer = create_model(args, data_set)
    #args.init_learning_rate as current initial learning rate has been reset from the model loaded

    model.train()

    model_dir = "%s/model" % (args.save_dir)
    if not os.path.isdir(model_dir):
        os.makedirs(model_dir)

    words_to_train = float(args.max_train_epoch * data_set.word_count) + 1
    data_set.setup_data_set(words_to_train)
    previous_words, step_time, loss = 0., 0., 0.
    get_batch_time = 0.0
    start_time = time.time()
    current_epoch = args.start_epoch
    current_step = 0
    total_norm = 0.
    is_best = False
    while current_epoch < args.max_train_epoch:
        print("Initialize epoch:%d" % current_epoch)
        data_set.initialize_epoch()
        word_has_next = True

        while word_has_next:
            time_flag = time.time()
            batch_data = None
            #only when it's its turn and not empty
            #or when the other one is empty
            if word_has_next:
                #print("train word")
                if args.model_net_struct == 'AVHEM':
                    batch_data = data_set.get_av_train_batch()
                else:
                    batch_data = data_set.get_train_batch()
                word_has_next = batch_data[-1]

            get_batch_time += time.time() - time_flag
            pivot_time = time.time()
            learning_rate = args.init_learning_rate * max(
                0.0001, 1.0 - data_set.finished_word_num / words_to_train)
            if args.optimizer == 'sgd':
                adjust_learning_rate(optimizer, learning_rate)

            if len(batch_data[0]) > 0:
                time_flag = time.time()
                step_loss = model(batch_data[:-1])
                optimizer.zero_grad()
                step_loss.backward()
                cur_batch_norm = torch.nn.utils.clip_grad_norm_(
                    model.parameters(), args.max_gradient_norm)
                total_norm += cur_batch_norm / args.steps_per_checkpoint
                optimizer.step()
                loss += step_loss.item(
                ) / args.steps_per_checkpoint  #convert an tensor with dim 0 to value
                current_step += 1
                step_time += time.time() - time_flag

            # Once in a while, we print statistics.
            if current_step % args.steps_per_checkpoint == 0:
                print(
                    "Epoch %d Words %d/%d: lr = %5.4f loss = %6.2f words/sec = %5.2f prepare_time %.2f step_time %.2f"
                    % (current_epoch, data_set.finished_word_num,
                       words_to_train, learning_rate, loss,
                       (data_set.finished_word_num - previous_words) /
                       (time.time() - start_time), get_batch_time,
                       step_time))  #, end=""
                print(
                    "av_loss:%.2f ia_loss:%.2f iav_loss:%.2f iav_pos_loss:%.2f iav_neg_loss:%.2f up_loss1:%.2f"
                    % (model.group_av_loss / args.steps_per_checkpoint,
                       model.group_ia_loss / args.steps_per_checkpoint,
                       model.group_iav_loss / args.steps_per_checkpoint,
                       model.group_iav_pos_loss / args.steps_per_checkpoint,
                       model.group_iav_neg_loss / args.steps_per_checkpoint,
                       model.group_up_loss1 / args.steps_per_checkpoint))
                print(
                    "total_norm:%.2f word_loss:%.2f uw_loss:%.2f pw_loss:%.2f up_loss2:%.2f"
                    % (total_norm,
                       model.group_word_loss / args.steps_per_checkpoint,
                       model.group_uw_loss / args.steps_per_checkpoint,
                       model.group_pw_loss / args.steps_per_checkpoint,
                       model.group_up_loss2 / args.steps_per_checkpoint))

                model.group_ia_loss, model.group_iav_loss, model.group_up_loss1 = 0., 0., 0.
                model.group_uw_loss, model.group_pw_loss, model.group_up_loss2 = 0., 0., 0.
                model.group_av_loss, model.group_word_loss, model.group_iav_pos_loss = 0., 0., 0.
                model.group_iav_neg_loss, step_time, get_batch_time = 0., 0., 0.

                total_norm, loss = 0., 0.
                current_step = 1
                sys.stdout.flush()
                previous_words = data_set.finished_word_num
                start_time = time.time()
        #save model after each epoch
        save_checkpoint(
            {
                'epoch': current_epoch + 1,
                'learning_rate': learning_rate,
                'state_dict': model.state_dict(),
                'optimizer': optimizer.state_dict()
            }, is_best, model_path)

        current_epoch += 1
    save_checkpoint(
        {
            'epoch': current_epoch,
            'learning_rate': learning_rate,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict()
        }, is_best, model_path)