Example #1
0
def main():
    read_f = file("./data/train_data", "rb")
    train_generator = cPickle.load(read_f)
    read_f.close()
    read_f = file("./data/emb", "rb")
    embedding_matrix, _, _ = cPickle.load(read_f)
    read_f.close()
    test_generator = DataGenerator("test", args.batch_size)

    model = Network(args.embedding_size, args.embedding_dimension, embedding_matrix, args.hidden_dimension).cuda()
    best_model = Network(args.embedding_size, args.embedding_dimension, embedding_matrix, args.hidden_dimension).cuda()
    optimizer = optim.Adam(model.parameters(), lr=args.learning_rate, weight_decay=args.l2_reg)

    best_result = 0.0
    for echo in range(args.epoch_num):
        info = "[" + echo * ">" + " " * (args.epoch_num - echo) + "]"
        sys.stderr.write(info + "\r")
        cost1, cost2, cost, total_num = 0.0, 0.0, 0.0, 0
        for data in train_generator.generate_data(shuffle=True):
            zp_rep, npc_rep, np_rep, feature = model.forward(data, dropout=args.dropout)
            output = model.generate_score(zp_rep, npc_rep, np_rep, feature)
            optimizer.zero_grad()
            dis1 = output[data['wid']] - output[data['cid']] + args.margin
            dis2 = output[data['uwid']] - args.wrong_bound
            dis3 = args.correct_bound - output[data['ucid']]
            triplet_loss = torch.sum(dis1 * (dis1 > 0).cuda().float()) + torch.sum(
                dis2 * (dis2 > 0).cuda().float()) + torch.sum(dis3 * (dis3 > 0).cuda().float())

            cos_sim_sum = torch.sum(1 - F.cosine_similarity(np_rep[data['cid1']], np_rep[data['cid2']]))
            sim_w = 0.5

            num = data["result"].shape[0]

            total_loss = triplet_loss + sim_w * cos_sim_sum
            total_loss.backward()

            cost += total_loss.item() * num
            cost1 += triplet_loss.item() * num
            cost2 += cos_sim_sum.item() * num
            total_num += num
            optimizer.step()
        train_re = evaluate_train(train_generator, model)
        dev_re, dev_cost = evaluate_dev(train_generator, model, args.margin)
        if dev_re > best_result:
            best_result = dev_re
            net_copy(best_model, model)
        test_re = evaluate_test(test_generator, model)
        print 'Epoch %s; Train Cost: %.4f, %.4f, %.4f; Train Result: %.4f; Dev Result: %.4f, %.4f; Test Result: %.4f' % (
            echo, cost / total_num, cost1 / total_num, cost2 / total_num, train_re, dev_re, dev_cost, test_re)
    print >> sys.stderr
    torch.save(best_model, "./models/model")
    re = evaluate_test(test_generator, best_model)
    print "Performance on Test: F", re
                        mu=1.1)
                    gen_hr_imgs[:, c, i, j] = torch.tensor(new_pixel)
        gen_hr_imgs = gen_hr_imgs.data.cpu().numpy()
        gen_hr_imgs = np.transpose(gen_hr_imgs, (0, 3, 1, 2))
        save_samples(
            lr_batch.data.cpu().numpy(),
            samples_dir + '/lr_' + str(mu * 10) + '_' + str(e) + '.jpg')
        save_samples(
            hr_batch.data.cpu().numpy(),
            samples_dir + '/hr_' + str(mu * 10) + '_' + str(e) + '.jpg')
        save_samples(
            gen_hr_imgs,
            samples_dir + '/generate_' + str(mu * 10) + '_' + str(e) + '.jpg')
        continue

    prior_logits, conditioning_logits = model.forward(hr_batch, lr_batch)

    optimizer.zero_grad()

    def calc_losses(logits, labels):
        logits = logits.reshape(-1, 256)
        labels = torch.tensor(labels, dtype=torch.int64)
        labels = labels.reshape(-1)
        labels = labels.to(device)
        return criterion(logits, labels)

    loss1 = calc_losses(prior_logits + conditioning_logits, labels)
    loss2 = calc_losses(conditioning_logits, labels)
    loss3 = calc_losses(prior_logits, labels)

    loss = loss1 + loss2