Skip to content

Commit 4a7675c

Browse files
author
浅梦
authored
Fix the inconsistency of prediction results when the model is loaded with trained weights
1 parent ce140ff commit 4a7675c

File tree

9 files changed

+59
-47
lines changed

9 files changed

+59
-47
lines changed

deepctr/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from .utils import check_version
22

3-
__version__ = '0.7.2'
3+
__version__ = '0.7.3'
44
check_version(__version__)

deepctr/layers/utils.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def __init__(self, l2_reg=0.0, mode=0, use_bias=False, **kwargs):
6969

7070
self.l2_reg = l2_reg
7171
# self.l2_reg = tf.contrib.layers.l2_regularizer(float(l2_reg_linear))
72-
if mode not in [0,1,2]:
72+
if mode not in [0, 1, 2]:
7373
raise ValueError("mode must be 0,1 or 2")
7474
self.mode = mode
7575
self.use_bias = use_bias
@@ -81,24 +81,35 @@ def build(self, input_shape):
8181
shape=(1,),
8282
initializer=tf.keras.initializers.Zeros(),
8383
trainable=True)
84-
if self.mode != 0 :
85-
self.dense = tf.keras.layers.Dense(units=1, activation=None, use_bias=False,
86-
kernel_regularizer=tf.keras.regularizers.l2(self.l2_reg))
84+
if self.mode == 1:
85+
self.kernel = self.add_weight(
86+
'linear_kernel',
87+
shape=[int(input_shape[-1]), 1],
88+
initializer=tf.keras.initializers.glorot_normal(),
89+
regularizer=tf.keras.regularizers.l2(self.l2_reg),
90+
trainable=True)
91+
elif self.mode == 2 :
92+
self.kernel = self.add_weight(
93+
'linear_kernel',
94+
shape=[int(input_shape[1][-1]), 1],
95+
initializer=tf.keras.initializers.glorot_normal(),
96+
regularizer=tf.keras.regularizers.l2(self.l2_reg),
97+
trainable=True)
8798

8899
super(Linear, self).build(input_shape) # Be sure to call this somewhere!
89100

90-
def call(self, inputs , **kwargs):
91-
101+
def call(self, inputs, **kwargs):
92102
if self.mode == 0:
93103
sparse_input = inputs
94104
linear_logit = reduce_sum(sparse_input, axis=-1, keep_dims=True)
95105
elif self.mode == 1:
96106
dense_input = inputs
97-
linear_logit = self.dense(dense_input)
107+
fc = tf.tensordot(dense_input, self.kernel, axes=(-1, 0))
108+
linear_logit = fc
98109
else:
99110
sparse_input, dense_input = inputs
100-
101-
linear_logit = reduce_sum(sparse_input, axis=-1, keep_dims=False) + self.dense(dense_input)
111+
fc = tf.tensordot(dense_input, self.kernel, axes=(-1, 0))
112+
linear_logit = reduce_sum(sparse_input, axis=-1, keep_dims=False) + fc
102113
if self.use_bias:
103114
linear_logit += self.bias
104115

docs/source/History.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# History
2+
- 03/04/2020 : [v0.7.3](https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.3) released.Fix the inconsistency of prediction results when the model is loaded with trained weights.
23
- 02/08/2020 : [v0.7.2](https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.2) released.Fix some bugs.
34
- 01/28/2020 : [v0.7.1](https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.1) released.Simplify [VarLenSparseFeat](./Features.html#varlensparsefeat),support setting weight_normalization.Fix problem of embedding size of `SparseFeat` in `linear_feature_columns`.
45
- 11/24/2019 : [v0.7.0](https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.0) released.Refactor [feature columns](./Features.html#feature-columns).Different features can use different `embedding_dim` and group-wise interaction is available by setting `group_name`.

docs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
# The short X.Y version
2727
version = ''
2828
# The full version, including alpha/beta/rc tags
29-
release = '0.7.2'
29+
release = '0.7.3'
3030

3131

3232
# -- General configuration ---------------------------------------------------

docs/source/index.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ You can read the latest code at https://github.com/shenweichen/DeepCTR
3434

3535
News
3636
-----
37+
03/04/2020 : Fix the inconsistency of prediction results when the model is loaded with trained weights. `Changelog <https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.3>`_
38+
3739
02/08/2020 : Fix some bugs. `Changelog <https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.2>`_
3840

3941
01/28/2020 : Simplify `VarLenSparseFeat <./Features.html#varlensparsefeat>`_ ,support setting weight_normalization.Fix problem of embedding size of ``SparseFeat`` in ``linear_feature_columns``. `Changelog <https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.1>`_
4042

41-
11/24/2019 : Refactor `feature columns <./Features.html#feature-columns>`_ . Different features can use different ``embedding_dim`` and group-wise interaction is available by setting ``group_name``. `Changelog <https://github.com/shenweichen/DeepCTR/releases/tag/v0.7.0>`_
42-
4343
DisscussionGroup
4444
-----------------------
4545

examples/run_dien.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@
88
def get_xy_fd(use_neg=False, hash_flag=False):
99
feature_columns = [SparseFeat('user', 3, embedding_dim=10, use_hash=hash_flag),
1010
SparseFeat('gender', 2, embedding_dim=4, use_hash=hash_flag),
11-
SparseFeat('item', 3 + 1, embedding_dim=8, use_hash=hash_flag),
12-
SparseFeat('item_gender', 2 + 1, embedding_dim=4, use_hash=hash_flag),
13-
DenseFeat('score', 1)]
11+
SparseFeat('item_id', 3 + 1, embedding_dim=8, use_hash=hash_flag),
12+
SparseFeat('cate_id', 2 + 1, embedding_dim=4, use_hash=hash_flag),
13+
DenseFeat('pay_score', 1)]
1414

1515
feature_columns += [
16-
VarLenSparseFeat(SparseFeat('hist_item', vocabulary_size=3 + 1, embedding_dim=8, embedding_name='item'),
16+
VarLenSparseFeat(SparseFeat('hist_item_id', vocabulary_size=3 + 1, embedding_dim=8, embedding_name='item_id'),
1717
maxlen=4, length_name="seq_length"),
18-
VarLenSparseFeat(SparseFeat('hist_item_gender', 2 + 1, embedding_dim=4, embedding_name='item_gender'), maxlen=4,
18+
VarLenSparseFeat(SparseFeat('hist_cate_id', 2 + 1, embedding_dim=4, embedding_name='cate_id'), maxlen=4,
1919
length_name="seq_length")]
2020

21-
behavior_feature_list = ["item", "item_gender"]
21+
behavior_feature_list = ["item_id", "cate_id"]
2222
uid = np.array([0, 1, 2])
2323
ugender = np.array([0, 1, 0])
2424
iid = np.array([1, 2, 3]) # 0 is mask value
@@ -30,17 +30,17 @@ def get_xy_fd(use_neg=False, hash_flag=False):
3030

3131
behavior_length = np.array([3, 3, 2])
3232

33-
feature_dict = {'user': uid, 'gender': ugender, 'item': iid, 'item_gender': igender,
34-
'hist_item': hist_iid, 'hist_item_gender': hist_igender,
35-
'score': score, "seq_length": behavior_length}
33+
feature_dict = {'user': uid, 'gender': ugender, 'item_id': iid, 'cate_id': igender,
34+
'hist_item_id': hist_iid, 'hist_cate_id': hist_igender,
35+
'pay_score': score, "seq_length": behavior_length}
3636

3737
if use_neg:
38-
feature_dict['neg_hist_item'] = np.array([[1, 2, 3, 0], [1, 2, 3, 0], [1, 2, 0, 0]])
39-
feature_dict['neg_hist_item_gender'] = np.array([[1, 1, 2, 0], [2, 1, 1, 0], [2, 1, 0, 0]])
38+
feature_dict['neg_hist_item_id'] = np.array([[1, 2, 3, 0], [1, 2, 3, 0], [1, 2, 0, 0]])
39+
feature_dict['neg_hist_cate_id'] = np.array([[1, 1, 2, 0], [2, 1, 1, 0], [2, 1, 0, 0]])
4040
feature_columns += [
41-
VarLenSparseFeat(SparseFeat('neg_hist_item', vocabulary_size=3 + 1, embedding_dim=8, embedding_name='item'),
41+
VarLenSparseFeat(SparseFeat('neg_hist_item_id', vocabulary_size=3 + 1, embedding_dim=8, embedding_name='item_id'),
4242
maxlen=4, length_name="seq_length"),
43-
VarLenSparseFeat(SparseFeat('neg_hist_item_gender', 2 + 1, embedding_dim=4, embedding_name='item_gender'),
43+
VarLenSparseFeat(SparseFeat('neg_hist_cate_id', 2 + 1, embedding_dim=4, embedding_name='cate_id'),
4444
maxlen=4, length_name="seq_length")]
4545

4646
x = {name: feature_dict[name] for name in get_feature_names(feature_columns)}

examples/run_din.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,22 @@
77
def get_xy_fd():
88

99
feature_columns = [SparseFeat('user',3,embedding_dim=10),SparseFeat(
10-
'gender', 2,embedding_dim=4), SparseFeat('item', 3 + 1,embedding_dim=8), SparseFeat('item_gender', 2 + 1,embedding_dim=4),DenseFeat('score', 1)]
11-
feature_columns += [VarLenSparseFeat(SparseFeat('hist_item', vocabulary_size=3 + 1,embedding_dim=8,embedding_name='item'), maxlen=4),
12-
VarLenSparseFeat(SparseFeat('hist_item_gender', 2 + 1,embedding_dim=4, embedding_name='item_gender'), maxlen=4)]
10+
'gender', 2,embedding_dim=4), SparseFeat('item_id', 3 + 1,embedding_dim=8), SparseFeat('cate_id', 2 + 1,embedding_dim=4),DenseFeat('pay_score', 1)]
11+
feature_columns += [VarLenSparseFeat(SparseFeat('hist_item_id', vocabulary_size=3 + 1,embedding_dim=8,embedding_name='item_id'), maxlen=4),
12+
VarLenSparseFeat(SparseFeat('hist_cate_id', 2 + 1,embedding_dim=4, embedding_name='cate_id'), maxlen=4)]
1313

14-
behavior_feature_list = ["item", "item_gender"]
14+
behavior_feature_list = ["item", "cate_id"]
1515
uid = np.array([0, 1, 2])
1616
ugender = np.array([0, 1, 0])
1717
iid = np.array([1, 2, 3]) # 0 is mask value
18-
igender = np.array([1, 2, 1]) # 0 is mask value
19-
score = np.array([0.1, 0.2, 0.3])
18+
cate_id = np.array([1, 2, 1]) # 0 is mask value
19+
pay_score = np.array([0.1, 0.2, 0.3])
2020

2121
hist_iid = np.array([[1, 2, 3, 0], [1, 2, 3, 0], [1, 2, 0, 0]])
22-
hist_igender = np.array([[1, 1, 2, 0], [2, 1, 1, 0], [2, 1, 0, 0]])
22+
hist_cate_id = np.array([[1, 1, 2, 0], [2, 1, 1, 0], [2, 1, 0, 0]])
2323

24-
feature_dict = {'user': uid, 'gender': ugender, 'item': iid, 'item_gender': igender,
25-
'hist_item': hist_iid, 'hist_item_gender': hist_igender, 'score': score}
24+
feature_dict = {'user': uid, 'gender': ugender, 'item_id': iid, 'cate_id': cate_id,
25+
'hist_item_id': hist_iid, 'hist_cate_id': hist_cate_id, 'pay_score': pay_score}
2626
x = {name:feature_dict[name] for name in get_feature_names(feature_columns)}
2727
y = [1, 0, 1]
2828
return x, y, feature_columns, behavior_feature_list

examples/run_dsin.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,37 @@ def get_xy_fd(hash_flag=False):
99
feature_columns = [SparseFeat('user', 3, embedding_dim=10, use_hash=hash_flag),
1010
SparseFeat('gender', 2, embedding_dim=4, use_hash=hash_flag),
1111
SparseFeat('item', 3 + 1, embedding_dim=4, use_hash=hash_flag),
12-
SparseFeat('item_gender', 2 + 1, embedding_dim=4, use_hash=hash_flag),
13-
DenseFeat('score', 1)]
12+
SparseFeat('cate_id', 2 + 1, embedding_dim=4, use_hash=hash_flag),
13+
DenseFeat('pay_score', 1)]
1414
feature_columns += [
1515
VarLenSparseFeat(SparseFeat('sess_0_item', 3 + 1, embedding_dim=4, use_hash=hash_flag, embedding_name='item'),
1616
maxlen=4), VarLenSparseFeat(
17-
SparseFeat('sess_0_item_gender', 2 + 1, embedding_dim=4, use_hash=hash_flag, embedding_name='item_gender'),
17+
SparseFeat('sess_0_cate_id', 2 + 1, embedding_dim=4, use_hash=hash_flag, embedding_name='cate_id'),
1818
maxlen=4)]
1919
feature_columns += [
2020
VarLenSparseFeat(SparseFeat('sess_1_item', 3 + 1, embedding_dim=4, use_hash=hash_flag, embedding_name='item'),
2121
maxlen=4), VarLenSparseFeat(
22-
SparseFeat('sess_1_item_gender', 2 + 1, embedding_dim=4, use_hash=hash_flag, embedding_name='item_gender'),
22+
SparseFeat('sess_1_cate_id', 2 + 1, embedding_dim=4, use_hash=hash_flag, embedding_name='cate_id'),
2323
maxlen=4)]
2424

25-
behavior_feature_list = ["item", "item_gender"]
25+
behavior_feature_list = ["item", "cate_id"]
2626
uid = np.array([0, 1, 2])
2727
ugender = np.array([0, 1, 0])
2828
iid = np.array([1, 2, 3]) # 0 is mask value
29-
igender = np.array([1, 2, 1]) # 0 is mask value
29+
cateid = np.array([1, 2, 1]) # 0 is mask value
3030
score = np.array([0.1, 0.2, 0.3])
3131

3232
sess1_iid = np.array([[1, 2, 3, 0], [1, 2, 3, 0], [0, 0, 0, 0]])
33-
sess1_igender = np.array([[1, 1, 2, 0], [2, 1, 1, 0], [0, 0, 0, 0]])
33+
sess1_cate_id = np.array([[1, 1, 2, 0], [2, 1, 1, 0], [0, 0, 0, 0]])
3434

3535
sess2_iid = np.array([[1, 2, 3, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
36-
sess2_igender = np.array([[1, 1, 2, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
36+
sess2_cate_id = np.array([[1, 1, 2, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
3737

3838
sess_number = np.array([2, 1, 0])
3939

40-
feature_dict = {'user': uid, 'gender': ugender, 'item': iid, 'item_gender': igender,
41-
'sess_0_item': sess1_iid, 'sess_0_item_gender': sess1_igender, 'score': score,
42-
'sess_1_item': sess2_iid, 'sess_1_item_gender': sess2_igender, }
40+
feature_dict = {'user': uid, 'gender': ugender, 'item': iid, 'cate_id': cateid,
41+
'sess_0_item': sess1_iid, 'sess_0_cate_id': sess1_cate_id, 'pay_score': score,
42+
'sess_1_item': sess2_iid, 'sess_1_cate_id': sess2_cate_id, }
4343

4444
x = {name: feature_dict[name] for name in get_feature_names(feature_columns)}
4545
x["sess_length"] = sess_number

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
setuptools.setup(
1111
name="deepctr",
12-
version="0.7.2",
12+
version="0.7.3",
1313
author="Weichen Shen",
1414
author_email="[email protected]",
1515
description="Easy-to-use,Modular and Extendible package of deep learning based CTR(Click Through Rate) prediction models with tensorflow 1.x and 2.x .",

0 commit comments

Comments
 (0)