![深度推荐模型——DIEN [AAAI 19][Alibaba]_第1张图片](http://img.e-com-net.com/image/info8/db3ef5343c684856af13ef23ab7271fc.jpg)
![深度推荐模型——DIEN [AAAI 19][Alibaba]_第2张图片](http://img.e-com-net.com/image/info8/a7ab1c32c1654490bad6f97bac648dc8.jpg)
import tensorflow as tf
from tensorflow import keras
from utils import *
import numpy as np
EPOCH = 10
BATCH_SIZE = 32
VEC_DIM = 10
DROPOUT_RATE = 0.5
HEAD_NUM = 4
HIDE_SIZE = 128
LAYER_NUM = 3
DNN_LAYERS = [200, 80]
data, max_user_id, max_item_id = load_data()
BEHAVIOR_FEAT_NUM = 32
K = tf.keras.backend
def Dice(tensor):
batch_nor_tensor = keras.layers.BatchNormalization()(tensor)
batch_nor_sig_tensor = keras.activations.sigmoid(batch_nor_tensor)
alphas = K.variable(np.random.random(tensor.shape[-1]))
return batch_nor_sig_tensor * tensor + (1.0 - batch_nor_sig_tensor) * alphas * tensor
def run():
train_user_id_data, train_now_item_id_data, train_item_ids_data, train_rating_ids_data, train_y_data, \
test_user_id_data, test_now_item_id_data, test_item_ids_data, test_rating_ids_data, test_y_data = get_all_data(data)
user_id = keras.Input((1,))
now_item_id = keras.Input((1,))
items_ids = keras.Input((BEHAVIOR_FEAT_NUM,))
ratings_ids = keras.Input((BEHAVIOR_FEAT_NUM,))
usr_emb = keras.layers.Embedding(max_user_id + 1, VEC_DIM, input_length=1)(user_id)
usr_emb = keras.layers.Flatten()(usr_emb)
now_item_emb = keras.layers.Embedding(max_item_id + 1, VEC_DIM, input_length=1)(now_item_id)
now_item_emb_tile = tf.tile(now_item_emb, [1, BEHAVIOR_FEAT_NUM, 1])
now_item_emb = keras.layers.Flatten()(now_item_emb)
items_emb = keras.layers.Embedding(max_item_id + 1, VEC_DIM, input_length=BEHAVIOR_FEAT_NUM)(
items_ids)
ratings_emb = keras.layers.Embedding(6, VEC_DIM, input_length=BEHAVIOR_FEAT_NUM)(
ratings_ids)
behavior_layer_output = items_emb * ratings_emb
interest_extractor_layer_output = keras.layers.GRU(VEC_DIM, return_sequences=True,dropout=DROPOUT_RATE)(
behavior_layer_output)
interest_evolution_layer_output = now_item_emb_tile * interest_extractor_layer_output
interest_evolution_layer_output = keras.layers.GRU(VEC_DIM,dropout=DROPOUT_RATE)(interest_evolution_layer_output)
deep = keras.layers.concatenate([usr_emb, now_item_emb, interest_evolution_layer_output])
for units in DNN_LAYERS:
deep = keras.layers.Dense(units)(deep)
deep = Dice(deep)
deep = keras.layers.Dropout(DROPOUT_RATE)(deep)
auxiliary_dnn = []
for i in range(BEHAVIOR_FEAT_NUM - 1):
auxiliary_dnn.append(tf.reshape(behavior_layer_output[:, i + 1, :], shape=(-1, VEC_DIM)) * tf.reshape(
interest_extractor_layer_output[:, i, :], shape=(-1, VEC_DIM)))
behavior_layer_output_t = tf.transpose(auxiliary_dnn, perm=[1, 0, 2])
behavior_layer_output_t = tf.reshape(behavior_layer_output_t, shape=(
-1, (BEHAVIOR_FEAT_NUM - 1) * VEC_DIM))
behavior_layer_output_t = keras.layers.Dropout(DROPOUT_RATE)(behavior_layer_output_t)
deep = keras.layers.concatenate([behavior_layer_output_t, deep])
outputs = keras.layers.Dense(1, activation='sigmoid')(deep)
model = keras.Model(inputs=[user_id, now_item_id, items_ids, ratings_ids], outputs=outputs)
model.compile(loss='binary_crossentropy', optimizer=tf.train.AdamOptimizer(0.001), metrics=[keras.metrics.AUC()])
tbCallBack = keras.callbacks.TensorBoard(log_dir='./logs',
histogram_freq=0,
write_graph=True,
write_grads=True,
write_images=True,
embeddings_freq=0,
embeddings_layer_names=None,
embeddings_metadata=None)
model.fit([train_user_id_data, train_now_item_id_data, train_item_ids_data, train_rating_ids_data], train_y_data,
batch_size=BATCH_SIZE, epochs=EPOCH, verbose=2,
validation_data=(
[test_user_id_data, test_now_item_id_data, test_item_ids_data, test_rating_ids_data], test_y_data),
callbacks=[tbCallBack], workers=4)
run()