Files
fun-rec/codes/funrec/models/ranking/deepfm.py
T
2022-03-28 22:16:08 +08:00

55 lines
2.3 KiB
Python

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Flatten, Concatenate, Dense
from features import FeatureEncoder, get_linear_logits
from layers import FM, DNN, PredictLayer
def process_feature(linear_feature_columns, dnn_feature_columns, feature_encode):
"""
根据FeatureEncoder获取所有输入的Input层或者Embedding层,然后根据自己
实际场景的业务数据,对不同的特征进行处理.
"""
linear_input_sparse_dict = feature_encode.linear_sparse_feature_dict
group_embedding_dict = feature_encode.sparse_feature_dict
linear_input_sparse_list = list(linear_input_sparse_dict['default_group'].values())
linear_dense_dict = feature_encode.dense_feature_dict
linear_dense_list = list(linear_dense_dict.values())
dnn_emb_name = [fc.embedding_name for fc in dnn_feature_columns]
dnn_input_list = [v for k, v in group_embedding_dict['fm'].items()
if k in dnn_emb_name]
return linear_dense_list, linear_input_sparse_list, dnn_input_list
def DeepFM(linear_feature_columns, dnn_feature_columns, hidden_units=(32, 16, 1),
activation='relu', use_bias=True, dp_rate=0.2, use_bn=True, use_dp=True,
task='binary'):
# 构建所有特征的Input层和Embedding层
# 因为有些特征可能在linear层和dnn层会重复了
feature_columns = list(set(linear_feature_columns + dnn_feature_columns))
feature_encode = FeatureEncoder(feature_columns,
linear_sparse_feature=linear_feature_columns)
feature_input_layers_list = list(feature_encode.feature_input_layer_dict.values())
# 特征处理
linear_dense_list, linear_input_sparse_list, dnn_input_list = \
process_feature(linear_feature_columns, dnn_feature_columns, feature_encode)
fm_logits = FM()(dnn_input_list)
linear_logits = get_linear_logits(linear_dense_list, linear_input_sparse_list)
dnn_inputs = Flatten()(Concatenate(axis=1)(dnn_input_list))
dnn_logits = DNN(hidden_units, activation, use_bias, use_dp, dp_rate, dp_rate,
use_bn, get_logits=True)(dnn_inputs)
logits = linear_logits + fm_logits + dnn_logits
output = PredictLayer(task)(logits)
model = Model(feature_input_layers_list, output)
return model