model.py 4.2 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.

Y
yaoxuefeng 已提交
15 16
import math

T
tangwei 已提交
17 18
import paddle.fluid as fluid

19
from paddlerec.core.utils import envs
C
Chengmo 已提交
20
from paddlerec.core.model import ModelBase
Y
yaoxuefeng 已提交
21 22 23 24 25


class Model(ModelBase):
    def __init__(self, config):
        ModelBase.__init__(self, config)
T
for mat  
tangwei 已提交
26

27 28 29 30 31 32 33 34
    def _init_hyper_parameters(self):
        self.hidden1_units = envs.get_global_env(
            "hyper_parameters.hidden1_units", 75)
        self.hidden2_units = envs.get_global_env(
            "hyper_parameters.hidden2_units", 50)
        self.hidden3_units = envs.get_global_env(
            "hyper_parameters.hidden3_units", 25)

Y
yaoxuefeng 已提交
35
    def wide_part(self, data):
T
tangwei 已提交
36 37 38 39 40 41 42 43 44 45
        out = fluid.layers.fc(
            input=data,
            size=1,
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.TruncatedNormal(
                    loc=0.0, scale=1.0 / math.sqrt(data.shape[1])),
                regularizer=fluid.regularizer.L2DecayRegularizer(
                    regularization_coeff=1e-4)),
            act=None,
            name='wide')
Y
yaoxuefeng 已提交
46
        return out
T
for mat  
tangwei 已提交
47

Y
yaoxuefeng 已提交
48
    def fc(self, data, hidden_units, active, tag):
T
tangwei 已提交
49 50 51 52 53 54 55 56
        output = fluid.layers.fc(
            input=data,
            size=hidden_units,
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.TruncatedNormal(
                    loc=0.0, scale=1.0 / math.sqrt(data.shape[1]))),
            act=active,
            name=tag)
T
for mat  
tangwei 已提交
57

Y
yaoxuefeng 已提交
58
        return output
T
for mat  
tangwei 已提交
59

Y
yaoxuefeng 已提交
60 61 62 63
    def deep_part(self, data, hidden1_units, hidden2_units, hidden3_units):
        l1 = self.fc(data, hidden1_units, 'relu', 'l1')
        l2 = self.fc(l1, hidden2_units, 'relu', 'l2')
        l3 = self.fc(l2, hidden3_units, 'relu', 'l3')
T
for mat  
tangwei 已提交
64

Y
yaoxuefeng 已提交
65
        return l3
T
for mat  
tangwei 已提交
66

67
    def net(self, inputs, is_infer=False):
X
xujiaqi01 已提交
68 69 70
        wide_input = self._dense_data_var[0]
        deep_input = self._dense_data_var[1]
        label = self._sparse_data_var[0]
Y
yaoxuefeng 已提交
71 72

        wide_output = self.wide_part(wide_input)
73 74
        deep_output = self.deep_part(deep_input, self.hidden1_units,
                                     self.hidden2_units, self.hidden3_units)
T
tangwei 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

        wide_model = fluid.layers.fc(
            input=wide_output,
            size=1,
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.TruncatedNormal(
                    loc=0.0, scale=1.0)),
            act=None,
            name='w_wide')

        deep_model = fluid.layers.fc(
            input=deep_output,
            size=1,
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.TruncatedNormal(
                    loc=0.0, scale=1.0)),
            act=None,
            name='w_deep')
T
for mat  
tangwei 已提交
93

Y
yaoxuefeng 已提交
94
        prediction = fluid.layers.elementwise_add(wide_model, deep_model)
T
tangwei 已提交
95 96 97 98
        pred = fluid.layers.sigmoid(
            fluid.layers.clip(
                prediction, min=-15.0, max=15.0),
            name="prediction")
Y
yaoxuefeng 已提交
99 100

        num_seqs = fluid.layers.create_tensor(dtype='int64')
T
tangwei 已提交
101 102 103 104 105 106 107 108
        acc = fluid.layers.accuracy(
            input=pred,
            label=fluid.layers.cast(
                x=label, dtype='int64'),
            total=num_seqs)
        auc_var, batch_auc, auc_states = fluid.layers.auc(
            input=pred, label=fluid.layers.cast(
                x=label, dtype='int64'))
T
for mat  
tangwei 已提交
109

Y
yaoxuefeng 已提交
110 111 112
        self._metrics["AUC"] = auc_var
        self._metrics["BATCH_AUC"] = batch_auc
        self._metrics["ACC"] = acc
113 114 115
        if is_infer:
            self._infer_results["AUC"] = auc_var
            self._infer_results["ACC"] = acc
Y
yaoxuefeng 已提交
116

T
tangwei 已提交
117 118 119
        cost = fluid.layers.sigmoid_cross_entropy_with_logits(
            x=prediction, label=fluid.layers.cast(
                label, dtype='float32'))
Y
yaoxuefeng 已提交
120 121
        avg_cost = fluid.layers.mean(cost)
        self._cost = avg_cost