api_train_v2.py 3.9 KB
Newer Older
Y
Yu Yang 已提交
1
import paddle.v2 as paddle
Y
Yu Yang 已提交
2 3
import cPickle
import copy
Y
Yu Yang 已提交
4 5 6


def main():
Y
Yu Yang 已提交
7
    paddle.init(use_gpu=False)
Y
Yu Yang 已提交
8
    movie_title_dict = paddle.dataset.movielens.get_movie_title_dict()
Y
Refine  
Yu Yang 已提交
9 10 11 12 13
    uid = paddle.layer.data(
        name='user_id',
        type=paddle.data_type.integer_value(
            paddle.dataset.movielens.max_user_id() + 1))
    usr_emb = paddle.layer.embedding(input=uid, size=32)
Y
Yu Yang 已提交
14

Y
Refine  
Yu Yang 已提交
15 16 17 18 19 20 21 22
    usr_gender_id = paddle.layer.data(
        name='gender_id', type=paddle.data_type.integer_value(2))
    usr_gender_emb = paddle.layer.embedding(input=usr_gender_id, size=16)

    usr_age_id = paddle.layer.data(
        name='age_id',
        type=paddle.data_type.integer_value(
            len(paddle.dataset.movielens.age_table)))
Y
Yu Yang 已提交
23
    usr_age_emb = paddle.layer.embedding(input=usr_age_id, size=16)
Y
Refine  
Yu Yang 已提交
24

Y
Yu Yang 已提交
25 26 27 28 29 30 31 32 33
    usr_job_id = paddle.layer.data(
        name='job_id',
        type=paddle.data_type.integer_value(paddle.dataset.movielens.max_job_id(
        ) + 1))

    usr_job_emb = paddle.layer.embedding(input=usr_job_id, size=16)

    usr_combined_features = paddle.layer.fc(
        input=[usr_emb, usr_gender_emb, usr_age_emb, usr_job_emb],
Y
Refine  
Yu Yang 已提交
34 35 36 37 38 39 40 41 42
        size=200,
        act=paddle.activation.Tanh())

    mov_id = paddle.layer.data(
        name='movie_id',
        type=paddle.data_type.integer_value(
            paddle.dataset.movielens.max_movie_id() + 1))
    mov_emb = paddle.layer.embedding(input=mov_id, size=32)

Y
Yu Yang 已提交
43 44 45 46 47 48 49
    mov_categories = paddle.layer.data(
        name='category_id',
        type=paddle.data_type.sparse_binary_vector(
            len(paddle.dataset.movielens.movie_categories())))

    mov_categories_hidden = paddle.layer.fc(input=mov_categories, size=32)

Y
Refine  
Yu Yang 已提交
50 51
    mov_title_id = paddle.layer.data(
        name='movie_title',
Y
Yu Yang 已提交
52 53 54 55 56 57 58 59 60 61 62 63
        type=paddle.data_type.integer_value_sequence(len(movie_title_dict)))
    mov_title_emb = paddle.layer.embedding(input=mov_title_id, size=32)
    mov_title_conv = paddle.networks.sequence_conv_pool(
        input=mov_title_emb, hidden_size=32, context_len=3)

    mov_combined_features = paddle.layer.fc(
        input=[mov_emb, mov_categories_hidden, mov_title_conv],
        size=200,
        act=paddle.activation.Tanh())

    inference = paddle.layer.cos_sim(
        a=usr_combined_features, b=mov_combined_features, size=1, scale=5)
L
Luo Tao 已提交
64
    cost = paddle.layer.mse_cost(
Y
Yu Yang 已提交
65 66 67 68 69 70 71 72 73 74
        input=inference,
        label=paddle.layer.data(
            name='score', type=paddle.data_type.dense_vector(1)))

    parameters = paddle.parameters.create(cost)

    trainer = paddle.trainer.SGD(cost=cost,
                                 parameters=parameters,
                                 update_equation=paddle.optimizer.Adam(
                                     learning_rate=1e-4))
Y
Yu Yang 已提交
75
    feeding = {
Y
Stash  
Yu Yang 已提交
76 77 78 79 80 81 82 83 84
        'user_id': 0,
        'gender_id': 1,
        'age_id': 2,
        'job_id': 3,
        'movie_id': 4,
        'category_id': 5,
        'movie_title': 6,
        'score': 7
    }
Y
Yu Yang 已提交
85 86 87 88 89 90 91 92

    def event_handler(event):
        if isinstance(event, paddle.event.EndIteration):
            if event.batch_id % 100 == 0:
                print "Pass %d Batch %d Cost %.2f" % (
                    event.pass_id, event.batch_id, event.cost)

    trainer.train(
Y
Yu Yang 已提交
93 94 95
        reader=paddle.batch(
            paddle.reader.shuffle(
                paddle.dataset.movielens.train(), buf_size=8192),
Y
Stash  
Yu Yang 已提交
96
            batch_size=256),
Y
Yu Yang 已提交
97
        event_handler=event_handler,
Y
Yu Yang 已提交
98
        feeding=feeding,
Y
Yu Yang 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111
        num_passes=1)

    user_id = 234
    movie_id = 345

    user = paddle.dataset.movielens.user_info()[user_id]
    movie = paddle.dataset.movielens.movie_info()[movie_id]

    feature = user.value() + movie.value()

    def reader():
        yield feature

Y
Yu Yang 已提交
112
    infer_dict = copy.copy(feeding)
Y
Yu Yang 已提交
113 114 115 116 117
    del infer_dict['score']

    prediction = paddle.infer(
        output=inference,
        parameters=parameters,
Y
Yu Yang 已提交
118
        reader=paddle.batch(
Y
Yu Yang 已提交
119
            reader, batch_size=32),
Y
Yu Yang 已提交
120 121
        feeding=infer_dict)
    print(prediction + 5) / 2
Y
Yu Yang 已提交
122 123 124 125


if __name__ == '__main__':
    main()