Skip to content

Commit d8d7de6

Browse files
committed
reset
1 parent 6a93275 commit d8d7de6

File tree

4 files changed

+64
-64
lines changed

4 files changed

+64
-64
lines changed

models/rank/xdeepfm/config_bigdata.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ runner:
1919
train_reader_path: "criteo_reader" # importlib format
2020
use_gpu: True
2121
use_auc: False
22-
train_batch_size: 4096
22+
train_batch_size: 512
2323
epochs: 1
2424
print_interval: 10
2525
#model_init_path: "output_model/0" # init model
2626
model_save_path: "output_model_bigdata_deepfm_dy"
2727
test_data_dir: "../../../datasets/criteo/slot_test_data_full"
2828
infer_reader_path: "criteo_reader" # importlib format
29-
infer_batch_size: 4096
29+
infer_batch_size: 512
3030
infer_load_path: "output_model_bigdata_deepfm_dy"
3131
infer_start_epoch: 0
3232
infer_end_epoch: 1

models/rank/xdeepfm/net.py

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@
1313
# limitations under the License.
1414

1515
import paddle
16+
import paddle.nn as nn
17+
import paddle.nn.functional as F
1618
import math
19+
1720
from 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':

models/rank/xdeepfm/readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ cin结合了rnn和cnn的优点,有多个卷积层构成,对于除了初始
114114
在全量数据下模型的指标如下:
115115
| 模型 | auc | batch_size | epoch_num| Time of each epoch |
116116
| :------| :------ | :------ | :------| :------ |
117-
| xDeepFM | 0.77 | 512 | 1 | 约2.5小时 |
117+
| xDeepFM | 0.79 | 512 | 1 | 约2.5小时 |
118118

119119
1. 确认您当前所在目录为PaddleRec/models/rank/xdeepfm
120120
2. 进入paddlerec/datasets/criteo目录下,执行该脚本,会从国内源的服务器上下载我们预处理完成的criteo全量数据集,并解压到指定文件夹。

models/rank/xdeepfm/static_model.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ def create_feeds(self, is_infer=False):
6969
return feeds_list
7070

7171
def net(self, input, is_infer=False):
72-
self.sparse_inputs = self._sparse_data_var[1:]
73-
self.dense_input = self._dense_data_var[0]
74-
self.label_input = self._sparse_data_var[0]
72+
self.sparse_inputs = input[1:self.sparse_inputs_slot]
73+
self.dense_input = input[-1]
74+
self.label_input = input[0]
7575
sparse_number = self.sparse_inputs_slot - 1
7676
assert sparse_number == len(self.sparse_inputs)
7777

0 commit comments

Comments
 (0)