From e9c8f08f861293d5dc2f4e005b7b6ed47125ef17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E6=A2=A6?= Date: Sun, 11 Oct 2020 21:24:23 +0800 Subject: [PATCH] v0.8.2 Refactor DNN Layer --- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- .github/ISSUE_TEMPLATE/question.md | 4 ++-- README.md | 9 ++++----- deepctr/__init__.py | 2 +- deepctr/estimator/models/autoint.py | 6 ++---- deepctr/estimator/models/ccpm.py | 3 +-- deepctr/estimator/models/dcn.py | 6 ++---- deepctr/estimator/models/deepfm.py | 3 +-- deepctr/estimator/models/fibinet.py | 3 +-- deepctr/estimator/models/fnn.py | 3 +-- deepctr/estimator/models/fwfm.py | 3 +-- deepctr/estimator/models/nfm.py | 3 +-- deepctr/estimator/models/pnn.py | 3 +-- deepctr/estimator/models/wdl.py | 3 +-- deepctr/estimator/models/xdeepfm.py | 3 +-- deepctr/layers/core.py | 26 +++++++++++++++----------- deepctr/models/autoint.py | 6 ++---- deepctr/models/ccpm.py | 3 +-- deepctr/models/dcn.py | 6 ++---- deepctr/models/deepfm.py | 3 +-- deepctr/models/dien.py | 4 +--- deepctr/models/din.py | 3 +-- deepctr/models/dsin.py | 3 +-- deepctr/models/fgcnn.py | 3 +-- deepctr/models/fibinet.py | 3 +-- deepctr/models/flen.py | 3 +-- deepctr/models/fnn.py | 3 +-- deepctr/models/fwfm.py | 3 +-- deepctr/models/nfm.py | 3 +-- deepctr/models/pnn.py | 3 +-- deepctr/models/wdl.py | 3 +-- deepctr/models/xdeepfm.py | 3 +-- docs/requirements.readthedocs.txt | 2 +- docs/source/Examples.md | 8 +++++--- docs/source/History.md | 2 +- docs/source/Quick-Start.md | 7 ++++--- docs/source/conf.py | 2 +- docs/source/index.rst | 6 +++--- setup.py | 2 +- 39 files changed, 71 insertions(+), 97 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index fe22e671..78b188ff 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -19,8 +19,8 @@ Steps to reproduce the behavior: **Operating environment(运行环境):** - python version [e.g. 3.5, 3.7] - - tensorflow version [e.g. 1.4.0, 1.15.0, 2.2.0] - - deepctr version [e.g. 0.8.0,] + - tensorflow version [e.g. 1.4.0, 1.15.0, 2.3.0] + - deepctr version [e.g. 0.8.2,] **Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 5b030ecf..7362b9c8 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -16,5 +16,5 @@ Add any other context about the problem here. **Operating environment(运行环境):** - python version [e.g. 3.6] - - tensorflow version [e.g. 1.4.0, 1.5.0, 2.2.0] - - deepctr version [e.g. 0.8.0,] + - tensorflow version [e.g. 1.4.0, 1.5.0, 2.3.0] + - deepctr version [e.g. 0.8.2,] diff --git a/README.md b/README.md index 3c56e45b..4727aa0e 100644 --- a/README.md +++ b/README.md @@ -57,16 +57,16 @@ Let's [**Get Started!**](https://deepctr-doc.readthedocs.io/en/latest/Quick-Star ## Citation -- Weichen Shen. (2018). DeepCTR: Easy-to-use,Modular and Extendible package of deep-learning based CTR models. https://github.com/shenweichen/deepctr. +- Weichen Shen. (2017). DeepCTR: Easy-to-use,Modular and Extendible package of deep-learning based CTR models. https://github.com/shenweichen/deepctr. If you find this code useful in your research, please cite it using the following BibTeX: ```bibtex -@misc{shen2018deepctr, +@misc{shen2017deepctr, author = {Weichen Shen}, title = {DeepCTR: Easy-to-use,Modular and Extendible package of deep-learning based CTR models}, - year = {2018}, + year = {2017}, publisher = {GitHub}, journal = {GitHub Repository}, howpublished = {\url{https://github.com/shenweichen/deepctr}}, @@ -86,7 +86,6 @@ For more information about the recommendation system, such as **feature engineer 更多关于推荐系统的内容,如**特征工程,用户画像,召回,排序和多目标优化,在线学习与实时计算以及更多前沿技术和实战项目**等可参考: - - [推荐系统实战](https://www.julyedu.com/course/getDetail/181?ccode=5ee751d37278c) -- [推荐系统就业小班](https://www.julyedu.com/course/getDetail/321?ccode=5ee751d37278c) +- [互联网计算广告实战](https://www.julyedu.com/course/getDetail/158?ccode=5ee751d37278c) diff --git a/deepctr/__init__.py b/deepctr/__init__.py index f29589f4..c763d56b 100644 --- a/deepctr/__init__.py +++ b/deepctr/__init__.py @@ -1,4 +1,4 @@ from .utils import check_version -__version__ = '0.8.1' +__version__ = '0.8.2' check_version(__version__) diff --git a/deepctr/estimator/models/autoint.py b/deepctr/estimator/models/autoint.py index 87f8d354..f29a0447 100644 --- a/deepctr/estimator/models/autoint.py +++ b/deepctr/estimator/models/autoint.py @@ -73,14 +73,12 @@ def _model_fn(features, labels, mode, config): dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) if len(dnn_hidden_units) > 0 and att_layer_num > 0: # Deep & Interacting Layer - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, training=train_flag) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, training=train_flag) stack_out = tf.keras.layers.Concatenate()([att_output, deep_out]) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(stack_out) elif len(dnn_hidden_units) > 0: # Only Deep - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, training=train_flag) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, training=train_flag) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(deep_out) elif att_layer_num > 0: # Only Interacting Layer diff --git a/deepctr/estimator/models/ccpm.py b/deepctr/estimator/models/ccpm.py index b1122635..1586b9f7 100644 --- a/deepctr/estimator/models/ccpm.py +++ b/deepctr/estimator/models/ccpm.py @@ -80,8 +80,7 @@ def _model_fn(features, labels, mode, config): k=min(k, int(conv_result.shape[1])), axis=1)(conv_result) flatten_result = tf.keras.layers.Flatten()(pooling_result) - dnn_out = DNN(dnn_hidden_units, l2_reg=l2_reg_dnn, - dropout_rate=dnn_dropout, seed=seed)(flatten_result, training=train_flag) + dnn_out = DNN(dnn_hidden_units, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, seed=seed)(flatten_result, training=train_flag) dnn_logit = tf.keras.layers.Dense(1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) logits = linear_logits + dnn_logit diff --git a/deepctr/estimator/models/dcn.py b/deepctr/estimator/models/dcn.py index bf049b9a..1f62fa60 100644 --- a/deepctr/estimator/models/dcn.py +++ b/deepctr/estimator/models/dcn.py @@ -63,15 +63,13 @@ def _model_fn(features, labels, mode, config): dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) if len(dnn_hidden_units) > 0 and cross_num > 0: # Deep & Cross - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, training=train_flag) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, training=train_flag) cross_out = CrossNet(cross_num, l2_reg=l2_reg_cross)(dnn_input) stack_out = tf.keras.layers.Concatenate()([cross_out, deep_out]) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(stack_out) elif len(dnn_hidden_units) > 0: # Only Deep - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, training=train_flag) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, training=train_flag) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(deep_out) elif cross_num > 0: # Only Cross diff --git a/deepctr/estimator/models/deepfm.py b/deepctr/estimator/models/deepfm.py index fca18c37..30193c45 100644 --- a/deepctr/estimator/models/deepfm.py +++ b/deepctr/estimator/models/deepfm.py @@ -63,8 +63,7 @@ def _model_fn(features, labels, mode, config): fm_logit = FM()(concat_func(sparse_embedding_list, axis=1)) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, training=train_flag) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, training=train_flag) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed=seed))(dnn_output) diff --git a/deepctr/estimator/models/fibinet.py b/deepctr/estimator/models/fibinet.py index 97f0aaad..99f4e746 100644 --- a/deepctr/estimator/models/fibinet.py +++ b/deepctr/estimator/models/fibinet.py @@ -68,8 +68,7 @@ def _model_fn(features, labels, mode, config): dnn_input = combined_dnn_input( [Flatten()(concat_func([senet_bilinear_out, bilinear_out]))], dense_value_list) - dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input, training=train_flag) + dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input, training=train_flag) dnn_logit = Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) diff --git a/deepctr/estimator/models/fnn.py b/deepctr/estimator/models/fnn.py index f388cd94..3b200ddf 100644 --- a/deepctr/estimator/models/fnn.py +++ b/deepctr/estimator/models/fnn.py @@ -53,8 +53,7 @@ def _model_fn(features, labels, mode, config): sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns, l2_reg_embedding=l2_reg_embedding) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, - dnn_dropout, False, seed)(dnn_input, training=train_flag) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input, training=train_flag) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(deep_out) diff --git a/deepctr/estimator/models/fwfm.py b/deepctr/estimator/models/fwfm.py index 438b4755..9948ecf0 100644 --- a/deepctr/estimator/models/fwfm.py +++ b/deepctr/estimator/models/fwfm.py @@ -71,8 +71,7 @@ def _model_fn(features, labels, mode, config): if dnn_hidden_units: dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, training=train_flag) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, training=train_flag) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_output) final_logit_components.append(dnn_logit) diff --git a/deepctr/estimator/models/nfm.py b/deepctr/estimator/models/nfm.py index 09b891c3..3bc3378c 100644 --- a/deepctr/estimator/models/nfm.py +++ b/deepctr/estimator/models/nfm.py @@ -61,8 +61,7 @@ def _model_fn(features, labels, mode, config): if bi_dropout: bi_out = tf.keras.layers.Dropout(bi_dropout)(bi_out, training=None) dnn_input = combined_dnn_input([bi_out], dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input, training=train_flag) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input, training=train_flag) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_output) diff --git a/deepctr/estimator/models/pnn.py b/deepctr/estimator/models/pnn.py index 1440dd8a..fc0f33fe 100644 --- a/deepctr/estimator/models/pnn.py +++ b/deepctr/estimator/models/pnn.py @@ -81,8 +81,7 @@ def _model_fn(features, labels, mode, config): deep_input = linear_signal dnn_input = combined_dnn_input([deep_input], dense_value_list) - dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input, training=train_flag) + dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input, training=train_flag) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) diff --git a/deepctr/estimator/models/wdl.py b/deepctr/estimator/models/wdl.py index a0a13323..29e7df2e 100644 --- a/deepctr/estimator/models/wdl.py +++ b/deepctr/estimator/models/wdl.py @@ -54,8 +54,7 @@ def _model_fn(features, labels, mode, config): sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns, l2_reg_embedding=l2_reg_embedding) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input, training=train_flag) + dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input, training=train_flag) dnn_logits = Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) diff --git a/deepctr/estimator/models/xdeepfm.py b/deepctr/estimator/models/xdeepfm.py index d8d3d6c2..a86b5e97 100644 --- a/deepctr/estimator/models/xdeepfm.py +++ b/deepctr/estimator/models/xdeepfm.py @@ -64,8 +64,7 @@ def _model_fn(features, labels, mode, config): fm_input = concat_func(sparse_embedding_list, axis=1) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, training=train_flag) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, training=train_flag) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_output) diff --git a/deepctr/layers/core.py b/deepctr/layers/core.py index 06a93b9b..f81bf97b 100644 --- a/deepctr/layers/core.py +++ b/deepctr/layers/core.py @@ -76,8 +76,7 @@ def build(self, input_shape): name="kernel") self.bias = self.add_weight( shape=(1,), initializer=Zeros(), name="bias") - self.dnn = DNN(self.hidden_units, self.activation, self.l2_reg, - self.dropout_rate, self.use_bn, seed=self.seed) + self.dnn = DNN(self.hidden_units, self.activation, self.l2_reg, self.dropout_rate, self.use_bn, seed=self.seed) self.dense = tf.keras.layers.Lambda(lambda x: tf.nn.bias_add(tf.tensordot( x[0], x[1], axes=(-1, 0)), x[2])) @@ -134,16 +133,21 @@ class DNN(Layer): - **use_bn**: bool. Whether use BatchNormalization before activation or not. + - **output_activation**: Activation function to use in the last layer.If ``None``,it will be same as ``activation``. + - **seed**: A Python integer to use as random seed. """ - def __init__(self, hidden_units, activation='relu', l2_reg=0, dropout_rate=0, use_bn=False, seed=1024, **kwargs): + def __init__(self, hidden_units, activation='relu', l2_reg=0, dropout_rate=0, use_bn=False, output_activation=None, + seed=1024, **kwargs): self.hidden_units = hidden_units self.activation = activation - self.dropout_rate = dropout_rate - self.seed = seed self.l2_reg = l2_reg + self.dropout_rate = dropout_rate self.use_bn = use_bn + self.output_activation = output_activation + self.seed = seed + super(DNN, self).__init__(**kwargs) def build(self, input_shape): @@ -170,6 +174,9 @@ def build(self, input_shape): self.activation_layers = [activation_layer(self.activation) for _ in range(len(self.hidden_units))] + if self.output_activation: + self.activation_layers[-1] = activation_layer(self.output_activation) + super(DNN, self).build(input_shape) # Be sure to call this somewhere! def call(self, inputs, training=None, **kwargs): @@ -179,9 +186,7 @@ def call(self, inputs, training=None, **kwargs): for i in range(len(self.hidden_units)): fc = tf.nn.bias_add(tf.tensordot( deep_input, self.kernels[i], axes=(-1, 0)), self.bias[i]) - # fc = Dense(self.hidden_size[i], activation=None, \ - # kernel_initializer=glorot_normal(seed=self.seed), \ - # kernel_regularizer=l2(self.l2_reg))(deep_input) + if self.use_bn: fc = self.bn_layers[i](fc, training=training) @@ -202,7 +207,8 @@ def compute_output_shape(self, input_shape): def get_config(self, ): config = {'activation': self.activation, 'hidden_units': self.hidden_units, - 'l2_reg': self.l2_reg, 'use_bn': self.use_bn, 'dropout_rate': self.dropout_rate, 'seed': self.seed} + 'l2_reg': self.l2_reg, 'use_bn': self.use_bn, 'dropout_rate': self.dropout_rate, + 'output_activation': self.output_activation, 'seed': self.seed} base_config = super(DNN, self).get_config() return dict(list(base_config.items()) + list(config.items())) @@ -249,5 +255,3 @@ def get_config(self, ): config = {'task': self.task, 'use_bias': self.use_bias} base_config = super(PredictionLayer, self).get_config() return dict(list(base_config.items()) + list(config.items())) - - diff --git a/deepctr/models/autoint.py b/deepctr/models/autoint.py index 9bf1f862..6ea70951 100644 --- a/deepctr/models/autoint.py +++ b/deepctr/models/autoint.py @@ -64,14 +64,12 @@ def AutoInt(linear_feature_columns, dnn_feature_columns, att_layer_num=3, att_em dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) if len(dnn_hidden_units) > 0 and att_layer_num > 0: # Deep & Interacting Layer - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) stack_out = tf.keras.layers.Concatenate()([att_output, deep_out]) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(stack_out) elif len(dnn_hidden_units) > 0: # Only Deep - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input, ) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input, ) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(deep_out) elif att_layer_num > 0: # Only Interacting Layer diff --git a/deepctr/models/ccpm.py b/deepctr/models/ccpm.py index 72fdabeb..7c7731dc 100644 --- a/deepctr/models/ccpm.py +++ b/deepctr/models/ccpm.py @@ -68,8 +68,7 @@ def CCPM(linear_feature_columns, dnn_feature_columns, conv_kernel_width=(6, 5), k=min(k, int(conv_result.shape[1])), axis=1)(conv_result) flatten_result = tf.keras.layers.Flatten()(pooling_result) - dnn_out = DNN(dnn_hidden_units, l2_reg=l2_reg_dnn, - dropout_rate=dnn_dropout)(flatten_result) + dnn_out = DNN(dnn_hidden_units, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout)(flatten_result) dnn_logit = tf.keras.layers.Dense(1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) final_logit = add_func([dnn_logit, linear_logit]) diff --git a/deepctr/models/dcn.py b/deepctr/models/dcn.py index 148b5329..8762cb1b 100644 --- a/deepctr/models/dcn.py +++ b/deepctr/models/dcn.py @@ -50,15 +50,13 @@ def DCN(linear_feature_columns, dnn_feature_columns, cross_num=2, dnn_hidden_uni dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) if len(dnn_hidden_units) > 0 and cross_num > 0: # Deep & Cross - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) cross_out = CrossNet(cross_num, l2_reg=l2_reg_cross)(dnn_input) stack_out = tf.keras.layers.Concatenate()([cross_out, deep_out]) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(stack_out) elif len(dnn_hidden_units) > 0: # Only Deep - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) final_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(deep_out) elif cross_num > 0: # Only Cross diff --git a/deepctr/models/deepfm.py b/deepctr/models/deepfm.py index 486ca109..ebf62946 100644 --- a/deepctr/models/deepfm.py +++ b/deepctr/models/deepfm.py @@ -54,8 +54,7 @@ def DeepFM(linear_feature_columns, dnn_feature_columns, fm_group=[DEFAULT_GROUP_ dnn_input = combined_dnn_input(list(chain.from_iterable( group_embedding_dict.values())), dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed=seed))(dnn_output) diff --git a/deepctr/models/dien.py b/deepctr/models/dien.py index d7fc3469..aff88585 100644 --- a/deepctr/models/dien.py +++ b/deepctr/models/dien.py @@ -177,7 +177,6 @@ def DIEN(dnn_feature_columns, history_feature_list, sequence_embed_list = get_varlen_pooling_list(sequence_embed_dict, features, sparse_varlen_feature_columns, to_list=True) dnn_input_emb_list += sequence_embed_list - keys_emb = concat_func(keys_emb_list) deep_input_emb = concat_func(dnn_input_emb_list) query_emb = concat_func(query_emb_list) @@ -202,8 +201,7 @@ def DIEN(dnn_feature_columns, history_feature_list, deep_input_emb = tf.keras.layers.Flatten()(deep_input_emb) dnn_input = combined_dnn_input([deep_input_emb], dense_value_list) - output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, - dnn_dropout, use_bn, seed)(dnn_input) + output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, use_bn, seed=seed)(dnn_input) final_logit = Dense(1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(output) output = PredictionLayer(task)(final_logit) diff --git a/deepctr/models/din.py b/deepctr/models/din.py index 87e714ad..a0235748 100644 --- a/deepctr/models/din.py +++ b/deepctr/models/din.py @@ -86,8 +86,7 @@ def DIN(dnn_feature_columns, history_feature_list, dnn_use_bn=False, deep_input_emb = tf.keras.layers.Concatenate()([NoMask()(deep_input_emb), hist]) deep_input_emb = tf.keras.layers.Flatten()(deep_input_emb) dnn_input = combined_dnn_input([deep_input_emb], dense_value_list) - output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, - dnn_dropout, dnn_use_bn, seed)(dnn_input) + output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) final_logit = tf.keras.layers.Dense(1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(output) diff --git a/deepctr/models/dsin.py b/deepctr/models/dsin.py index 59d132d0..d80f294c 100644 --- a/deepctr/models/dsin.py +++ b/deepctr/models/dsin.py @@ -128,8 +128,7 @@ def DSIN(dnn_feature_columns, sess_feature_list, sess_max_count=5, bias_encoding [dnn_input_emb, Flatten()(interest_attention_layer), Flatten()(lstm_attention_layer)]) dnn_input_emb = combined_dnn_input([dnn_input_emb], dense_value_list) - output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, - dnn_dropout, dnn_use_bn, seed)(dnn_input_emb) + output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input_emb) output = Dense(1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(output) output = PredictionLayer(task)(output) diff --git a/deepctr/models/fgcnn.py b/deepctr/models/fgcnn.py index b1ffbd5e..5fb079a6 100644 --- a/deepctr/models/fgcnn.py +++ b/deepctr/models/fgcnn.py @@ -76,8 +76,7 @@ def FGCNN(linear_feature_columns, dnn_feature_columns, conv_kernel_width=(7, 7, dnn_input = tf.keras.layers.Concatenate()([linear_signal, inner_product]) dnn_input = tf.keras.layers.Flatten()(dnn_input) - final_logit = DNN(dnn_hidden_units, dropout_rate=dnn_dropout, - l2_reg=l2_reg_dnn)(dnn_input) + final_logit = DNN(dnn_hidden_units, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout)(dnn_input) final_logit = tf.keras.layers.Dense(1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(final_logit) final_logit = add_func([final_logit, linear_logit]) diff --git a/deepctr/models/fibinet.py b/deepctr/models/fibinet.py index 249fdb6b..d57d1059 100644 --- a/deepctr/models/fibinet.py +++ b/deepctr/models/fibinet.py @@ -56,8 +56,7 @@ def FiBiNET(linear_feature_columns, dnn_feature_columns, bilinear_type='interact dnn_input = combined_dnn_input( [tf.keras.layers.Flatten()(concat_func([senet_bilinear_out, bilinear_out]))], dense_value_list) - dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input) + dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) diff --git a/deepctr/models/flen.py b/deepctr/models/flen.py index 03993e1e..3c9d629b 100644 --- a/deepctr/models/flen.py +++ b/deepctr/models/flen.py @@ -69,8 +69,7 @@ def FLEN(linear_feature_columns, dnn_input = combined_dnn_input( list(chain.from_iterable(group_embedding_dict.values())), dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense(1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(concat_func([fm_mf_out, dnn_output])) diff --git a/deepctr/models/fnn.py b/deepctr/models/fnn.py index 645a03bf..69f93e02 100644 --- a/deepctr/models/fnn.py +++ b/deepctr/models/fnn.py @@ -42,8 +42,7 @@ def FNN(linear_feature_columns, dnn_feature_columns, dnn_hidden_units=(128, 128) l2_reg_embedding, seed) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, - dnn_dropout, False, seed)(dnn_input) + deep_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(deep_out) final_logit = add_func([dnn_logit, linear_logit]) diff --git a/deepctr/models/fwfm.py b/deepctr/models/fwfm.py index c2f27ef8..3a2abe5e 100644 --- a/deepctr/models/fwfm.py +++ b/deepctr/models/fwfm.py @@ -60,8 +60,7 @@ def FwFM(linear_feature_columns, dnn_feature_columns, fm_group=[DEFAULT_GROUP_NA if dnn_hidden_units: dnn_input = combined_dnn_input(list(chain.from_iterable( group_embedding_dict.values())), dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_output) final_logit_components.append(dnn_logit) diff --git a/deepctr/models/nfm.py b/deepctr/models/nfm.py index 82cde661..7e14879c 100644 --- a/deepctr/models/nfm.py +++ b/deepctr/models/nfm.py @@ -49,8 +49,7 @@ def NFM(linear_feature_columns, dnn_feature_columns, dnn_hidden_units=(128, 128) if bi_dropout: bi_out = tf.keras.layers.Dropout(bi_dropout)(bi_out, training=None) dnn_input = combined_dnn_input([bi_out], dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_output) diff --git a/deepctr/models/pnn.py b/deepctr/models/pnn.py index d5b62c95..c015759f 100644 --- a/deepctr/models/pnn.py +++ b/deepctr/models/pnn.py @@ -64,8 +64,7 @@ def PNN(dnn_feature_columns, dnn_hidden_units=(128, 128), l2_reg_embedding=1e-5, deep_input = linear_signal dnn_input = combined_dnn_input([deep_input], dense_value_list) - dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input) + dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) diff --git a/deepctr/models/wdl.py b/deepctr/models/wdl.py index 10d4c2ee..7820cf0c 100644 --- a/deepctr/models/wdl.py +++ b/deepctr/models/wdl.py @@ -44,8 +44,7 @@ def WDL(linear_feature_columns, dnn_feature_columns, dnn_hidden_units=(128, 128) l2_reg_embedding, seed) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - False, seed)(dnn_input) + dnn_out = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_out) diff --git a/deepctr/models/xdeepfm.py b/deepctr/models/xdeepfm.py index bed3f626..f86652e0 100644 --- a/deepctr/models/xdeepfm.py +++ b/deepctr/models/xdeepfm.py @@ -52,8 +52,7 @@ def xDeepFM(linear_feature_columns, dnn_feature_columns, dnn_hidden_units=(256, fm_input = concat_func(sparse_embedding_list, axis=1) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, - dnn_use_bn, seed)(dnn_input) + dnn_output = DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input) dnn_logit = tf.keras.layers.Dense( 1, use_bias=False, kernel_initializer=tf.keras.initializers.glorot_normal(seed))(dnn_output) diff --git a/docs/requirements.readthedocs.txt b/docs/requirements.readthedocs.txt index 26ff9379..ff790594 100644 --- a/docs/requirements.readthedocs.txt +++ b/docs/requirements.readthedocs.txt @@ -1 +1 @@ -tensorflow==1.15.2 \ No newline at end of file +tensorflow==1.15.4 \ No newline at end of file diff --git a/docs/source/Examples.md b/docs/source/Examples.md index 82f9db28..b855c302 100644 --- a/docs/source/Examples.md +++ b/docs/source/Examples.md @@ -331,9 +331,11 @@ and run the following codes. ```python import tensorflow as tf +from tensorflow.python.ops.parsing_ops import FixedLenFeature from deepctr.estimator import DeepFMEstimator from deepctr.estimator.inputs import input_fn_tfrecord + if __name__ == "__main__": # 1.generate feature_column for linear part and dnn part @@ -354,10 +356,10 @@ if __name__ == "__main__": # 2.generate input data for model - feature_description = {k: tf.FixedLenFeature(dtype=tf.int64, shape=1) for k in sparse_features} + feature_description = {k: FixedLenFeature(dtype=tf.int64, shape=1) for k in sparse_features} feature_description.update( - {k: tf.FixedLenFeature(dtype=tf.float32, shape=1) for k in dense_features}) - feature_description['label'] = tf.FixedLenFeature(dtype=tf.float32, shape=1) + {k: FixedLenFeature(dtype=tf.float32, shape=1) for k in dense_features}) + feature_description['label'] = FixedLenFeature(dtype=tf.float32, shape=1) train_model_input = input_fn_tfrecord('./criteo_sample.tr.tfrecords', feature_description, 'label', batch_size=256, num_epochs=1, shuffle_factor=10) diff --git a/docs/source/History.md b/docs/source/History.md index 09dfec9a..44e7aa43 100644 --- a/docs/source/History.md +++ b/docs/source/History.md @@ -1,5 +1,5 @@ # History - +- 10/11/2020 : [v0.8.2](https://github.com/shenweichen/DeepCTR/releases/tag/v0.8.2) released.Refactor `DNN` Layer. - 09/12/2020 : [v0.8.1](https://github.com/shenweichen/DeepCTR/releases/tag/v0.8.1) released.Improve the reproducibility & fix some bugs. - 06/27/2020 : [v0.8.0](https://github.com/shenweichen/DeepCTR/releases/tag/v0.8.0) released. - Support `Tensorflow Estimator` for large scale data and distributed training. [example: Estimator with TFRecord](https://deepctr-doc.readthedocs.io/en/latest/Examples.html#estimator-with-tfrecord-classification-criteo) diff --git a/docs/source/Quick-Start.md b/docs/source/Quick-Start.md index 53e540b0..0a862a0f 100644 --- a/docs/source/Quick-Start.md +++ b/docs/source/Quick-Start.md @@ -127,6 +127,7 @@ You can check the full code [here](./Examples.html#classification-criteo). ```python import tensorflow as tf +from tensorflow.python.ops.parsing_ops import FixedLenFeature from deepctr.estimator.inputs import input_fn_tfrecord from deepctr.estimator.models import DeepFMEstimator @@ -153,10 +154,10 @@ for feat in dense_features: ### Step 3: Generate the training samples with TFRecord format ```python -feature_description = {k: tf.FixedLenFeature(dtype=tf.int64, shape=1) for k in sparse_features} +feature_description = {k: FixedLenFeature(dtype=tf.int64, shape=1) for k in sparse_features} feature_description.update( - {k: tf.FixedLenFeature(dtype=tf.float32, shape=1) for k in dense_features}) -feature_description['label'] = tf.FixedLenFeature(dtype=tf.float32, shape=1) + {k: FixedLenFeature(dtype=tf.float32, shape=1) for k in dense_features}) +feature_description['label'] = FixedLenFeature(dtype=tf.float32, shape=1) train_model_input = input_fn_tfrecord('./criteo_sample.tr.tfrecords', feature_description, 'label', batch_size=256, num_epochs=1, shuffle_factor=10) diff --git a/docs/source/conf.py b/docs/source/conf.py index 3bd5055b..823e43c0 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -26,7 +26,7 @@ # The short X.Y version version = '' # The full version, including alpha/beta/rc tags -release = '0.8.1' +release = '0.8.2' # -- General configuration --------------------------------------------------- diff --git a/docs/source/index.rst b/docs/source/index.rst index 89b0b101..fa5047e3 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -43,12 +43,12 @@ You can read the latest code and related projects News ----- +10/11/2020 : Refactor ``DNN`` Layer. `Changelog `_ + 09/12/2020 : Improve the reproducibility & fix some bugs. `Changelog `_ 06/27/2020 : Support ``Tensorflow Estimator`` for large scale data and distributed training.Support different initializers for different embedding weights and loading pretrained embeddings.Add new model ``FwFM``. `Changelog `_ -05/17/2020 : Fix numerical instability in ``LayerNormalization``. `Changelog `_ - DisscussionGroup 交流群 ----------------------- @@ -64,7 +64,7 @@ For more information about the recommendation system, such as **feature engineer 更多关于推荐系统的内容,如 **特征工程,用户画像,召回,排序和多目标优化,在线学习与实时计算以及更多前沿技术和实战项目** 等可参考: - `推荐系统实战 `_ -- `推荐系统就业小班 `_ +- `互联网计算广告实战 `_ diff --git a/setup.py b/setup.py index 8580d66c..5f06066d 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setuptools.setup( name="deepctr", - version="0.8.1", + version="0.8.2", author="Weichen Shen", author_email="wcshen1994@163.com", 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 .",