model.py 5.1 KB
Newer Older
T
tangwei 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

T
tangwei 已提交
15 16
import math
import paddle.fluid as fluid
T
tangwei 已提交
17

T
tangwei 已提交
18
from fleetrec.utils import envs
T
tangwei 已提交
19 20


T
tangwei 已提交
21
class Train(object):
T
tangwei 已提交
22

T
tangwei 已提交
23 24 25 26
    def __init__(self):
        self.sparse_inputs = []
        self.dense_input = None
        self.label_input = None
T
tangwei 已提交
27

T
tangwei 已提交
28 29 30
        self.sparse_input_varnames = []
        self.dense_input_varname = None
        self.label_input_varname = None
T
tangwei12 已提交
31 32
        
        self.namespace = "train.model"
T
tangwei 已提交
33 34

    def input(self):
T
tangwei 已提交
35
        def sparse_inputs():
T
tangwei12 已提交
36
            ids = envs.get_global_env("hyper_parameters.sparse_inputs_slots", None ,self.namespace)
T
tangwei 已提交
37

T
tangwei 已提交
38 39 40 41
            sparse_input_ids = [
                fluid.layers.data(name="C" + str(i),
                                  shape=[1],
                                  lod_level=1,
T
tangwei12 已提交
42
                                  dtype="int64") for i in range(1, ids)
T
tangwei 已提交
43 44 45 46
            ]
            return sparse_input_ids, [var.name for var in sparse_input_ids]

        def dense_input():
T
tangwei12 已提交
47
            dim = envs.get_global_env("hyper_parameters.dense_input_dim", None ,self.namespace)
T
tangwei 已提交
48 49

            dense_input_var = fluid.layers.data(name="dense_input",
T
tangwei12 已提交
50
                                                shape=[dim],
T
tangwei 已提交
51 52 53 54 55 56 57 58 59 60
                                                dtype="float32")
            return dense_input_var, dense_input_var.name

        def label_input():
            label = fluid.layers.data(name="label", shape=[1], dtype="int64")
            return label, label.name

        self.sparse_inputs, self.sparse_input_varnames = sparse_inputs()
        self.dense_input, self.dense_input_varname = dense_input()
        self.label_input, self.label_input_varname = label_input()
T
tangwei 已提交
61

T
tangwei 已提交
62
    def input_vars(self):
T
tangwei12 已提交
63
        return [self.dense_input] + self.sparse_inputs + [self.label_input]
T
tangwei 已提交
64 65 66 67

    def input_varnames(self):
        return [input.name for input in self.input_vars()]

T
tangwei 已提交
68
    def net(self):
T
tangwei 已提交
69
        def embedding_layer(input):
T
tangwei12 已提交
70 71
            sparse_feature_number = envs.get_global_env("hyper_parameters.sparse_feature_number", None ,self.namespace)
            sparse_feature_dim = envs.get_global_env("hyper_parameters.sparse_feature_dim", None ,self.namespace)
T
tangwei 已提交
72

T
tangwei 已提交
73 74 75
            emb = fluid.layers.embedding(
                input=input,
                is_sparse=True,
T
tangwei12 已提交
76
                size=[sparse_feature_number, sparse_feature_dim],
T
tangwei 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
                param_attr=fluid.ParamAttr(
                    name="SparseFeatFactors",
                    initializer=fluid.initializer.Uniform()),
            )
            emb_sum = fluid.layers.sequence_pool(
                input=emb, pool_type='sum')
            return emb_sum

        def fc(input, output_size):
            output = fluid.layers.fc(
                input=input, size=output_size,
                act='relu', param_attr=fluid.ParamAttr(
                    initializer=fluid.initializer.Normal(
                        scale=1.0 / math.sqrt(input.shape[1]))))
            return output

        sparse_embed_seq = list(map(embedding_layer, self.sparse_inputs))
        concated = fluid.layers.concat(sparse_embed_seq + [self.dense_input], axis=1)

        fcs = [concated]
T
tangwei12 已提交
97
        hidden_layers = envs.get_global_env("hyper_parameters.fc_sizes", None ,self.namespace)
T
tangwei 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111

        for size in hidden_layers:
            fcs.append(fc(fcs[-1], size))

        predict = fluid.layers.fc(
            input=fcs[-1],
            size=2,
            act="softmax",
            param_attr=fluid.ParamAttr(initializer=fluid.initializer.Normal(
                scale=1 / math.sqrt(fcs[-1].shape[1]))),
        )

        self.predict = predict

T
tangwei12 已提交
112 113
    def avg_loss(self):
        cost = fluid.layers.cross_entropy(input=self.predict, label=self.label_input)
T
tangwei 已提交
114 115
        avg_cost = fluid.layers.reduce_sum(cost)
        self.loss = avg_cost
T
tangwei 已提交
116
        return avg_cost
T
tangwei 已提交
117

T
tangwei 已提交
118
    def metrics(self):
T
tangwei 已提交
119 120 121 122
        auc, batch_auc, _ = fluid.layers.auc(input=self.predict,
                                             label=self.label_input,
                                             num_thresholds=2 ** 12,
                                             slide_steps=20)
T
tangwei 已提交
123
        self.metrics = (auc, batch_auc)
T
tangwei 已提交
124

T
tangwei12 已提交
125 126
        return self.metrics

T
tangwei12 已提交
127 128 129 130 131 132
    def metric_extras(self):
        self.metric_vars = [self.metrics[0]]
        self.metric_alias = ["AUC"]
        self.fetch_interval_batchs = 10 
        return (self.metric_vars, self.metric_alias, self.fetch_interval_batchs)

T
tangwei 已提交
133
    def optimizer(self):
T
tangwei12 已提交
134
        learning_rate = envs.get_global_env("hyper_parameters.learning_rate", None ,self.namespace)
T
tangwei 已提交
135 136 137 138 139 140 141 142 143
        optimizer = fluid.optimizer.Adam(learning_rate, lazy_mode=True)
        return optimizer


class Evaluate(object):
    def input(self):
        pass

    def net(self):
T
tangwei 已提交
144
        pass