Skip to content

Commit 34e8fa5

Browse files
committedDec 4, 2018
Updata docs&minor changes
1. Modified some default parameters 2. Remove the dropout before first dense layer in MLP
1 parent 3da641f commit 34e8fa5

File tree

14 files changed

+118
-106
lines changed

14 files changed

+118
-106
lines changed
 

‎deepctr/layers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ class CrossNet(Layer):
206206
References
207207
- [Deep & Cross Network for Ad Click Predictions](https://arxiv.org/abs/1708.05123)
208208
"""
209-
def __init__(self, layer_num=1,l2_reg=0,seed=1024, **kwargs):
209+
def __init__(self, layer_num=2,l2_reg=0,seed=1024, **kwargs):
210210
self.layer_num = layer_num
211211
self.l2_reg = l2_reg
212212
self.seed = seed
@@ -287,7 +287,7 @@ def build(self, input_shape):
287287

288288
def call(self, inputs,**kwargs):
289289
deep_input = inputs
290-
deep_input = Dropout(1 - self.keep_prob)(deep_input)
290+
#deep_input = Dropout(1 - self.keep_prob)(deep_input)
291291

292292
for l in range(len(self.hidden_size)):
293293
fc = Dense(self.hidden_size[l], activation=None, \

‎deepctr/models/afm.py

+35-30
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@
1010
1111
"""
1212

13-
from tensorflow.python.keras.layers import Dense, Embedding, Concatenate, Reshape, add
13+
from tensorflow.python.keras.layers import Dense, Embedding, Concatenate, Reshape, add
1414
from tensorflow.python.keras.models import Model
1515
from tensorflow.python.keras.initializers import RandomNormal
1616
from tensorflow.python.keras.regularizers import l2
1717

1818
from ..utils import get_input
19-
from ..layers import PredictionLayer,AFMLayer,FM
19+
from ..layers import PredictionLayer, AFMLayer, FM
2020

2121

22-
def AFM(feature_dim_dict, embedding_size=8,use_attention=True, attention_factor=4,
23-
l2_reg_linear=1e-5, l2_reg_embedding=1e-5, l2_reg_att=1e-5,keep_prob=1.0,init_std=0.0001,seed=1024,
24-
final_activation='sigmoid',):
22+
def AFM(feature_dim_dict, embedding_size=8, use_attention=True, attention_factor=8,
23+
l2_reg_linear=1e-5, l2_reg_embedding=1e-5, l2_reg_att=1e-5, keep_prob=1.0, init_std=0.0001, seed=1024,
24+
final_activation='sigmoid',):
2525
"""Instantiates the Attentonal Factorization Machine architecture.
2626
2727
:param feature_dim_dict: dict,to indicate sparse field and dense field like {'sparse':{'field_1':4,'field_2':3,'field_3':2},'dense':['field_4','field_5']}
@@ -42,22 +42,24 @@ def AFM(feature_dim_dict, embedding_size=8,use_attention=True, attention_factor=
4242
dict) or "sparse" not in feature_dim_dict or "dense" not in feature_dim_dict:
4343
raise ValueError(
4444
"feature_dim_dict must be a dict like {'sparse':{'field_1':4,'field_2':3,'field_3':2},'dense':['field_4','field_5']}")
45-
if not isinstance(feature_dim_dict["sparse"],dict):
46-
raise ValueError("feature_dim_dict['sparse'] must be a dict,cur is",type(feature_dim_dict['sparse']))
47-
if not isinstance(feature_dim_dict["dense"],list):
48-
raise ValueError("feature_dim_dict['dense'] must be a list,cur is", type(feature_dim_dict['dense']))
49-
50-
51-
52-
53-
sparse_input, dense_input = get_input(feature_dim_dict,None)
54-
sparse_embedding, linear_embedding, = get_embeddings(feature_dim_dict,embedding_size,init_std,seed,l2_reg_embedding,l2_reg_linear)
55-
56-
embed_list = [sparse_embedding[i](sparse_input[i]) for i in range(len(sparse_input))]
57-
linear_term = [linear_embedding[i](sparse_input[i]) for i in range(len(sparse_input))]
45+
if not isinstance(feature_dim_dict["sparse"], dict):
46+
raise ValueError("feature_dim_dict['sparse'] must be a dict,cur is", type(
47+
feature_dim_dict['sparse']))
48+
if not isinstance(feature_dim_dict["dense"], list):
49+
raise ValueError("feature_dim_dict['dense'] must be a list,cur is", type(
50+
feature_dim_dict['dense']))
51+
52+
sparse_input, dense_input = get_input(feature_dim_dict, None)
53+
sparse_embedding, linear_embedding, = get_embeddings(
54+
feature_dim_dict, embedding_size, init_std, seed, l2_reg_embedding, l2_reg_linear)
55+
56+
embed_list = [sparse_embedding[i](sparse_input[i])
57+
for i in range(len(sparse_input))]
58+
linear_term = [linear_embedding[i](sparse_input[i])
59+
for i in range(len(sparse_input))]
5860
if len(linear_term) > 1:
5961
linear_term = add(linear_term)
60-
elif len(linear_term) >0:
62+
elif len(linear_term) > 0:
6163
linear_term = linear_term[0]
6264
else:
6365
linear_term = 0
@@ -66,37 +68,40 @@ def AFM(feature_dim_dict, embedding_size=8,use_attention=True, attention_factor=
6668
continuous_embedding_list = list(
6769
map(Dense(embedding_size, use_bias=False, kernel_regularizer=l2(l2_reg_embedding), ),
6870
dense_input))
69-
continuous_embedding_list = list(map(Reshape((1, embedding_size)), continuous_embedding_list))
71+
continuous_embedding_list = list(
72+
map(Reshape((1, embedding_size)), continuous_embedding_list))
7073
embed_list += continuous_embedding_list
7174

72-
dense_input_ = dense_input[0] if len(dense_input) == 1 else Concatenate()(dense_input)
73-
linear_dense_logit = Dense(1,activation=None,use_bias=False,kernel_regularizer=l2(l2_reg_linear))(dense_input_)
74-
linear_term = add([linear_dense_logit,linear_term])
75+
dense_input_ = dense_input[0] if len(
76+
dense_input) == 1 else Concatenate()(dense_input)
77+
linear_dense_logit = Dense(
78+
1, activation=None, use_bias=False, kernel_regularizer=l2(l2_reg_linear))(dense_input_)
79+
linear_term = add([linear_dense_logit, linear_term])
7580

7681
fm_input = Concatenate(axis=1)(embed_list)
7782
if use_attention:
78-
fm_out = AFMLayer(attention_factor,l2_reg_att,keep_prob,seed)(embed_list)
83+
fm_out = AFMLayer(attention_factor, l2_reg_att,
84+
keep_prob, seed)(embed_list)
7985
else:
8086
fm_out = FM()(fm_input)
8187

82-
final_logit = add([linear_term,fm_out])
88+
final_logit = add([linear_term, fm_out])
8389
output = PredictionLayer(final_activation)(final_logit)
84-
model = Model(inputs=sparse_input + dense_input , outputs=output)
90+
model = Model(inputs=sparse_input + dense_input, outputs=output)
8591
return model
8692

8793

8894
def get_embeddings(feature_dim_dict, embedding_size, init_std, seed, l2_rev_V, l2_reg_w):
8995
sparse_embedding = [Embedding(feature_dim_dict["sparse"][feat], embedding_size,
90-
embeddings_initializer=RandomNormal(mean=0.0, stddev=init_std, seed=seed),
96+
embeddings_initializer=RandomNormal(
97+
mean=0.0, stddev=init_std, seed=seed),
9198
embeddings_regularizer=l2(l2_rev_V),
9299
name='sparse_emb_' + str(i) + '-' + feat) for i, feat in
93100
enumerate(feature_dim_dict["sparse"])]
94101
linear_embedding = [Embedding(feature_dim_dict["sparse"][feat], 1,
95102
embeddings_initializer=RandomNormal(mean=0.0, stddev=init_std,
96-
seed=seed)
97-
, embeddings_regularizer=l2(l2_reg_w),
103+
seed=seed), embeddings_regularizer=l2(l2_reg_w),
98104
name='linear_emb_' + str(i) + '-' + feat) for
99105
i, feat in enumerate(feature_dim_dict["sparse"])]
100106

101107
return sparse_embedding, linear_embedding
102-

‎deepctr/models/dcn.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717

1818
def DCN(feature_dim_dict, embedding_size='auto',
19-
cross_num=2, hidden_size=(32,), l2_reg_embedding=1e-5, l2_reg_cross=0, l2_reg_deep=0,
20-
init_std=0.0001, seed=1024, keep_prob=1, use_bn=True, activation='relu', final_activation='sigmoid',
19+
cross_num=2, hidden_size=[128, 128, ], l2_reg_embedding=1e-5, l2_reg_cross=1e-5, l2_reg_deep=0,
20+
init_std=0.0001, seed=1024, keep_prob=1, use_bn=False, activation='relu', final_activation='sigmoid',
2121
):
2222
"""Instantiates the Deep&Cross Network architecture.
2323
@@ -90,8 +90,8 @@ def get_embeddings(feature_dim_dict, embedding_size, init_std, seed, l2_rev_V):
9090
embeddings_regularizer=l2(l2_rev_V), name='sparse_emb_' + str(i) + '-'+feat) for i, feat in
9191
enumerate(feature_dim_dict["sparse"])]
9292

93-
print("DCN total auto embed size", sum(
94-
[int(pow(feature_dim_dict["sparse"][k], 0.25)) for k, v in feature_dim_dict["sparse"].items()]))
93+
print("Using auto embedding size,the connected vector dimension is", sum(
94+
[6*int(pow(feature_dim_dict["sparse"][k], 0.25)) for k, v in feature_dim_dict["sparse"].items()]))
9595
else:
9696
sparse_embedding = [Embedding(feature_dim_dict["sparse"][feat], embedding_size,
9797
embeddings_initializer=RandomNormal(

‎deepctr/models/deepfm.py

+32-28
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@
88
99
"""
1010

11-
from tensorflow.python.keras.layers import Dense, Embedding, Concatenate, Reshape, Flatten, add
11+
from tensorflow.python.keras.layers import Dense, Embedding, Concatenate, Reshape, Flatten, add
1212
from tensorflow.python.keras.models import Model
1313
from tensorflow.python.keras.initializers import RandomNormal
1414
from tensorflow.python.keras.regularizers import l2
1515

1616

1717
from ..utils import get_input
18-
from ..layers import PredictionLayer,MLP,FM
18+
from ..layers import PredictionLayer, MLP, FM
1919

2020

2121
def DeepFM(feature_dim_dict, embedding_size=8,
22-
use_fm=True, hidden_size=[256,256], l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_deep=0,
23-
init_std=0.0001, seed=1024, keep_prob=0.5, activation='relu', final_activation='sigmoid', use_bn=False):
22+
use_fm=True, hidden_size=[128, 128], l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_deep=0,
23+
init_std=0.0001, seed=1024, keep_prob=1, activation='relu', final_activation='sigmoid', use_bn=False):
2424
"""Instantiates the DeepFM Network architecture.
2525
2626
:param feature_dim_dict: dict,to indicate sparse field and dense field like {'sparse':{'field_1':4,'field_2':3,'field_3':2},'dense':['field_4','field_5']}
@@ -42,22 +42,24 @@ def DeepFM(feature_dim_dict, embedding_size=8,
4242
dict) or "sparse" not in feature_dim_dict or "dense" not in feature_dim_dict:
4343
raise ValueError(
4444
"feature_dim_dict must be a dict like {'sparse':{'field_1':4,'field_2':3,'field_3':2},'dense':['field_5',]}")
45-
if not isinstance(feature_dim_dict["sparse"],dict):
46-
raise ValueError("feature_dim_dict['sparse'] must be a dict,cur is",type(feature_dim_dict['sparse']))
47-
if not isinstance(feature_dim_dict["dense"],list):
48-
raise ValueError("feature_dim_dict['dense'] must be a list,cur is", type(feature_dim_dict['dense']))
49-
50-
51-
52-
53-
sparse_input, dense_input = get_input(feature_dim_dict,None)
54-
sparse_embedding, linear_embedding, = get_embeddings(feature_dim_dict,embedding_size,init_std,seed,l2_reg_deep,l2_reg_linear)
55-
56-
embed_list = [sparse_embedding[i](sparse_input[i]) for i in range(len(sparse_input))]
57-
linear_term = [linear_embedding[i](sparse_input[i]) for i in range(len(sparse_input))]
45+
if not isinstance(feature_dim_dict["sparse"], dict):
46+
raise ValueError("feature_dim_dict['sparse'] must be a dict,cur is", type(
47+
feature_dim_dict['sparse']))
48+
if not isinstance(feature_dim_dict["dense"], list):
49+
raise ValueError("feature_dim_dict['dense'] must be a list,cur is", type(
50+
feature_dim_dict['dense']))
51+
52+
sparse_input, dense_input = get_input(feature_dim_dict, None)
53+
sparse_embedding, linear_embedding, = get_embeddings(
54+
feature_dim_dict, embedding_size, init_std, seed, l2_reg_embedding, l2_reg_linear)
55+
56+
embed_list = [sparse_embedding[i](sparse_input[i])
57+
for i in range(len(sparse_input))]
58+
linear_term = [linear_embedding[i](sparse_input[i])
59+
for i in range(len(sparse_input))]
5860
if len(linear_term) > 1:
5961
linear_term = add(linear_term)
60-
elif len(linear_term) >0:
62+
elif len(linear_term) > 0:
6163
linear_term = linear_term[0]
6264
else:
6365
linear_term = 0
@@ -66,19 +68,22 @@ def DeepFM(feature_dim_dict, embedding_size=8,
6668
continuous_embedding_list = list(
6769
map(Dense(embedding_size, use_bias=False, kernel_regularizer=l2(l2_reg_embedding), ),
6870
dense_input))
69-
continuous_embedding_list = list(map(Reshape((1, embedding_size)), continuous_embedding_list))
71+
continuous_embedding_list = list(
72+
map(Reshape((1, embedding_size)), continuous_embedding_list))
7073
embed_list += continuous_embedding_list
7174

72-
dense_input_ = dense_input[0] if len(dense_input) == 1 else Concatenate()(dense_input)
73-
linear_dense_logit = Dense(1,activation=None,use_bias=False,kernel_regularizer=l2(l2_reg_linear))(dense_input_)
74-
linear_term = add([linear_dense_logit,linear_term])
75+
dense_input_ = dense_input[0] if len(
76+
dense_input) == 1 else Concatenate()(dense_input)
77+
linear_dense_logit = Dense(
78+
1, activation=None, use_bias=False, kernel_regularizer=l2(l2_reg_linear))(dense_input_)
79+
linear_term = add([linear_dense_logit, linear_term])
7580

7681
fm_input = Concatenate(axis=1)(embed_list)
7782
deep_input = Flatten()(fm_input)
7883
fm_out = FM()(fm_input)
7984
deep_out = MLP(hidden_size, activation, l2_reg_deep, keep_prob,
8085
use_bn, seed)(deep_input)
81-
deep_logit = Dense(1,use_bias=False, activation=None)(deep_out)
86+
deep_logit = Dense(1, use_bias=False, activation=None)(deep_out)
8287

8388
if len(hidden_size) == 0 and use_fm == False: # only linear
8489
final_logit = linear_term
@@ -92,22 +97,21 @@ def DeepFM(feature_dim_dict, embedding_size=8,
9297
raise NotImplementedError
9398

9499
output = PredictionLayer(final_activation)(final_logit)
95-
model = Model(inputs=sparse_input + dense_input , outputs=output)
100+
model = Model(inputs=sparse_input + dense_input, outputs=output)
96101
return model
97102

98103

99104
def get_embeddings(feature_dim_dict, embedding_size, init_std, seed, l2_rev_V, l2_reg_w):
100105
sparse_embedding = [Embedding(feature_dim_dict["sparse"][feat], embedding_size,
101-
embeddings_initializer=RandomNormal(mean=0.0, stddev=init_std, seed=seed),
106+
embeddings_initializer=RandomNormal(
107+
mean=0.0, stddev=init_std, seed=seed),
102108
embeddings_regularizer=l2(l2_rev_V),
103109
name='sparse_emb_' + str(i) + '-' + feat) for i, feat in
104110
enumerate(feature_dim_dict["sparse"])]
105111
linear_embedding = [Embedding(feature_dim_dict["sparse"][feat], 1,
106112
embeddings_initializer=RandomNormal(mean=0.0, stddev=init_std,
107-
seed=seed)
108-
, embeddings_regularizer=l2(l2_reg_w),
113+
seed=seed), embeddings_regularizer=l2(l2_reg_w),
109114
name='linear_emb_' + str(i) + '-' + feat) for
110115
i, feat in enumerate(feature_dim_dict["sparse"])]
111116

112117
return sparse_embedding, linear_embedding
113-

‎deepctr/models/din.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ def get_input(feature_dim_dict, seq_feature_list, seq_max_len):
2929
return sparse_input, user_behavior_input, user_behavior_length
3030

3131

32-
def DIN(feature_dim_dict, seq_feature_list, embedding_size=4, hist_len_max=16,
33-
use_din=True, use_bn=False, hidden_size=[200, 80], activation=Dice, att_hidden_size=[80, 40], att_activation='sigmoid', att_weight_normalization=True,
34-
l2_reg_deep=5e-5, l2_reg_embedding=0, final_activation='sigmoid', keep_prob=1, init_std=0.0001, seed=1024, ):
32+
def DIN(feature_dim_dict, seq_feature_list, embedding_size=8, hist_len_max=16,
33+
use_din=True, use_bn=False, hidden_size=[200, 80], activation='relu', att_hidden_size=[80, 40], att_activation='sigmoid', att_weight_normalization=True,
34+
l2_reg_deep=0, l2_reg_embedding=1e-5, final_activation='sigmoid', keep_prob=1, init_std=0.0001, seed=1024, ):
3535
"""Instantiates the Deep Interest Network architecture.
3636
3737
:param feature_dim_dict: dict,to indicate sparse field (**now only support sparse feature**)like {'sparse':{'field_1':4,'field_2':3,'field_3':2},'dense':[]}

0 commit comments

Comments
 (0)