1313# limitations under the License.
1414
1515import paddle
16+ import paddle .nn as nn
17+ import paddle .nn .functional as F
1618import math
19+
1720from paddle .regularizer import L2Decay
1821
1922
20- class xDeepFMLayer (paddle . nn .Layer ):
23+ class xDeepFMLayer (nn .Layer ):
2124 def __init__ (self , sparse_feature_number , sparse_feature_dim ,
2225 dense_feature_dim , sparse_num_field , layer_sizes_cin ,
2326 layer_sizes_dnn ):
@@ -28,44 +31,44 @@ def __init__(self, sparse_feature_number, sparse_feature_dim,
2831 self .sparse_num_field = sparse_num_field
2932 self .layer_sizes_cin = layer_sizes_cin
3033 self .layer_sizes_dnn = layer_sizes_dnn
31- self .dense_emb_dim = self .sparse_feature_dim
3234
33- self .linear = Linear (sparse_feature_number ,
34- dense_feature_dim + sparse_num_field ,
35- sparse_feature_dim , dense_feature_dim )
35+ self .fm = Linear (sparse_feature_number , sparse_feature_dim ,
36+ dense_feature_dim , sparse_num_field )
3637 self .cin = CIN (sparse_feature_dim ,
3738 dense_feature_dim + sparse_num_field , layer_sizes_cin )
3839
3940 self .dnn = DNN (sparse_feature_dim ,
4041 dense_feature_dim + sparse_num_field , layer_sizes_dnn )
4142
43+ self .bias = paddle .create_parameter (
44+ shape = [1 ],
45+ dtype = 'float32' ,
46+ default_initializer = paddle .nn .initializer .Constant (value = 0.0 ))
47+
4248 def forward (self , sparse_inputs , dense_inputs ):
4349
44- y_linear , feat_embeddings = self .linear (sparse_inputs , dense_inputs )
50+ y_linear , feat_embeddings = self .fm (sparse_inputs , dense_inputs )
4551 y_cin = self .cin (feat_embeddings )
4652 y_dnn = self .dnn (feat_embeddings )
47-
48- predict = paddle .nn .functional .sigmoid (y_linear + y_cin + y_dnn )
49-
53+ predict = F .sigmoid (y_linear + self .bias + y_cin + y_dnn )
5054 return predict
5155
5256
53- class Linear (paddle . nn .Layer ):
54- def __init__ (self , sparse_feature_number , num_field , sparse_feature_dim ,
55- dense_feature_dim ):
57+ class Linear (nn .Layer ):
58+ def __init__ (self , sparse_feature_number , sparse_feature_dim ,
59+ dense_feature_dim , sparse_num_field ):
5660 super (Linear , self ).__init__ ()
5761 self .sparse_feature_number = sparse_feature_number
58- self .num_field = num_field
5962 self .sparse_feature_dim = sparse_feature_dim
6063 self .dense_feature_dim = dense_feature_dim
61- self .init_value_ = 0.1
6264 self .dense_emb_dim = self .sparse_feature_dim
65+ self .sparse_num_field = sparse_num_field
66+ self .init_value_ = 0.1
6367
64- # sparse coding
68+ # sparse part coding
6569 self .embedding_one = paddle .nn .Embedding (
6670 sparse_feature_number ,
6771 1 ,
68- padding_idx = 0 ,
6972 sparse = True ,
7073 weight_attr = paddle .ParamAttr (
7174 initializer = paddle .nn .initializer .TruncatedNormal (
@@ -77,29 +80,22 @@ def __init__(self, sparse_feature_number, num_field, sparse_feature_dim,
7780 self .sparse_feature_number ,
7881 self .sparse_feature_dim ,
7982 sparse = True ,
80- padding_idx = 0 ,
8183 weight_attr = paddle .ParamAttr (
8284 initializer = paddle .nn .initializer .TruncatedNormal (
8385 mean = 0.0 ,
8486 std = self .init_value_ /
8587 math .sqrt (float (self .sparse_feature_dim )))))
8688
87- # dense coding
89+ # dense part coding
8890 self .dense_w_one = paddle .create_parameter (
8991 shape = [self .dense_feature_dim ],
9092 dtype = 'float32' ,
91- default_initializer = paddle .nn .initializer .TruncatedNormal (
92- mean = 0.0 ,
93- std = self .init_value_ /
94- math .sqrt (float (self .sparse_feature_dim ))))
93+ default_initializer = paddle .nn .initializer .Constant (value = 1.0 ))
9594
9695 self .dense_w = paddle .create_parameter (
9796 shape = [1 , self .dense_feature_dim , self .dense_emb_dim ],
9897 dtype = 'float32' ,
99- default_initializer = paddle .nn .initializer .TruncatedNormal (
100- mean = 0.0 ,
101- std = self .init_value_ /
102- math .sqrt (float (self .sparse_feature_dim ))))
98+ default_initializer = paddle .nn .initializer .Constant (value = 1.0 ))
10399
104100 def forward (self , sparse_inputs , dense_inputs ):
105101 sparse_inputs_concat = paddle .concat (sparse_inputs , axis = 1 )
@@ -108,36 +104,55 @@ def forward(self, sparse_inputs, dense_inputs):
108104 dense_emb_one = paddle .multiply (dense_inputs , self .dense_w_one )
109105 dense_emb_one = paddle .unsqueeze (dense_emb_one , axis = 2 )
110106
107+ y_linear = paddle .sum (sparse_emb_one , 1 ) + paddle .sum (dense_emb_one , 1 )
108+
111109 sparse_embeddings = self .embedding (sparse_inputs_concat )
112110 dense_inputs_re = paddle .unsqueeze (dense_inputs , axis = 2 )
113111 dense_embeddings = paddle .multiply (dense_inputs_re , self .dense_w )
114112 feat_embeddings = paddle .concat ([sparse_embeddings , dense_embeddings ],
115113 1 )
116114
117- b_linear = paddle .create_parameter (
118- shape = [1 ],
119- dtype = 'float32' ,
120- default_initializer = paddle .nn .initializer .Constant (value = 0 ))
121-
122- y_linear = paddle .sum (sparse_emb_one , 1 ) + paddle .sum (dense_emb_one ,
123- 1 ) + b_linear
124-
125115 return y_linear , feat_embeddings
126116
127117
128- class CIN (paddle . nn .Layer ):
118+ class CIN (nn .Layer ):
129119 def __init__ (self , sparse_feature_dim , num_field , layer_sizes_cin ):
130120 super (CIN , self ).__init__ ()
131121 self .sparse_feature_dim = sparse_feature_dim
132122 self .num_field = num_field
133123 self .layer_sizes_cin = layer_sizes_cin
134124
135- def forward (self , feat_embeddings ):
125+ self .cnn_layers = []
126+ last_s = self .num_field
127+ for i in range (len (layer_sizes_cin )):
128+ _conv = nn .Conv2D (
129+ in_channels = last_s * self .num_field ,
130+ out_channels = layer_sizes_cin [i ],
131+ kernel_size = (1 , 1 ),
132+ weight_attr = paddle .ParamAttr (
133+ regularizer = L2Decay (coeff = 0.0001 ),
134+ initializer = paddle .nn .initializer .Normal (
135+ std = 1.0 / math .sqrt (last_s * self .num_field ))),
136+ bias_attr = False )
137+ last_s = layer_sizes_cin [i ]
138+ self .add_sublayer ('cnn_%d' % i , _conv )
139+ self .cnn_layers .append (_conv )
140+ tmp_sum = sum (self .layer_sizes_cin )
141+ self .cin_linear = paddle .nn .Linear (
142+ in_features = tmp_sum ,
143+ out_features = 1 ,
144+ weight_attr = paddle .ParamAttr (
145+ regularizer = L2Decay (coeff = 0.0001 ),
146+ initializer = paddle .nn .initializer .Normal (std = 0.1 /
147+ math .sqrt (tmp_sum ))))
148+ self .add_sublayer ('cnn_fc' , self .cin_linear )
136149
150+ def forward (self , feat_embeddings ):
137151 Xs = [feat_embeddings ]
138152 last_s = self .num_field
139153 #m = paddle.nn.Dropout(p=0.5)
140- for s in self .layer_sizes_cin :
154+
155+ for s , _conv in zip (self .layer_sizes_cin , self .cnn_layers ):
141156 # calculate Z^(k+1) with X^k and X^0
142157 X_0 = paddle .reshape (
143158 x = paddle .transpose (Xs [0 ], [0 , 2 , 1 ]),
@@ -163,43 +178,28 @@ def forward(self, feat_embeddings):
163178 - 1 , last_s * self .num_field , 1 , self .sparse_feature_dim
164179 ]
165180 ) # None, last_s*num_field, 1, embedding_size (None, channal_in, h, w)
166- _conv = paddle .nn .Conv2D (
167- in_channels = last_s * self .num_field ,
168- out_channels = s ,
169- kernel_size = (1 , 1 ),
170- weight_attr = paddle .ParamAttr (
171- regularizer = L2Decay (coeff = 0.0001 ),
172- initializer = paddle .nn .initializer .Normal (
173- std = 1.0 / math .sqrt (last_s * self .num_field ))),
174- bias_attr = False )
181+
175182 X_k_1 = _conv (Z_k_1 )
183+
176184 X_k_1 = paddle .reshape (
177185 x = X_k_1 ,
178186 shape = [- 1 , s ,
179187 self .sparse_feature_dim ]) # None, s, embedding_size
180188 #X_k_1 = m(X_k_1)
181189 Xs .append (X_k_1 )
182190 last_s = s
183-
184191 # sum pooling
185192 y_cin = paddle .concat (
186193 x = Xs [1 :], axis = 1 ) # None, (num_field++), embedding_size
187- y_cin = paddle .sum (x = y_cin , axis = - 1 ) # None, (num_field++)
194+ y_cin = paddle .sum (x = y_cin , axis = - 1 ) # None, (num_field++)i
188195 tmp_sum = sum (self .layer_sizes_cin )
189- cin_linear = paddle .nn .Linear (
190- in_features = tmp_sum ,
191- out_features = 1 ,
192- weight_attr = paddle .ParamAttr (
193- regularizer = L2Decay (coeff = 0.0001 ),
194- initializer = paddle .nn .initializer .Normal (std = 1.0 /
195- math .sqrt (tmp_sum ))))
196- y_cin = cin_linear (y_cin )
196+ y_cin = self .cin_linear (y_cin )
197197 y_cin = paddle .sum (x = y_cin , axis = - 1 , keepdim = True )
198198
199199 return y_cin
200200
201201
202- class DNN (paddle . nn .Layer ):
202+ class DNN (nn .Layer ):
203203 def __init__ (self , sparse_feature_dim , num_field , layer_sizes_dnn ):
204204 super (DNN , self ).__init__ ()
205205 self .sparse_feature_dim = sparse_feature_dim
@@ -216,7 +216,7 @@ def __init__(self, sparse_feature_dim, num_field, layer_sizes_dnn):
216216 weight_attr = paddle .ParamAttr (
217217 regularizer = L2Decay (coeff = 0.0001 ),
218218 initializer = paddle .nn .initializer .Normal (
219- std = 1.0 / math .sqrt (sizes [i ]))))
219+ std = 0.1 / math .sqrt (sizes [i ]))))
220220 self .add_sublayer ('linear_%d' % i , linear )
221221 self ._mlp_layers .append (linear )
222222 if acts [i ] == 'relu' :
0 commit comments