视频讲解:https://www.yuque.com/chudi/tzqav9/ny150b#2XiWP
import tensorflow as tf
from tensorflow import keras
from utils import *
EPOCH = 10
BATCH_SIZE = 32
VEC_DIM = 10
DNN_LAYERS = [64, 128, 64]
DROPOUT_RATE = 0.5
base, test = loadData()
# 所有的特征各个类别值个数之和
FEAT_CATE_NUM = base.shape[1] - 1
K = tf.keras.backend
class PairWiseInteractionAttentionLayer(keras.layers.Layer):
def __init__(self, vec_dim, attention_factor, **kwargs):
self.vec_dim = vec_dim
self.attention_factor = attention_factor
super(PairWiseInteractionAttentionLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.cnum = input_shape[1]
self.cross_num = self.cnum * (self.cnum - 1) // 2
self.W0 = self.add_weight(name='W0', shape=(self.vec_dim, self.attention_factor),
initializer='uniform',trainable=True)
self.W1 = self.add_weight(name='W1', shape=(self.attention_factor, 1), initializer='uniform',
trainable=True)
super(PairWiseInteractionAttentionLayer, self).build(input_shape)
def call(self, Input, **kwargs):
pi_emb = []
for i in range(self.cnum):
for j in range(i + 1, self.cnum):
pi_emb.append(tf.multiply(Input[:, i, :], Input[:, j, :]))
pi_emb = tf.stack(pi_emb, axis=1) # [-1,coss_num,vec_dim]
att = tf.matmul(tf.nn.relu(tf.matmul(pi_emb, self.W0)), self.W1) # [-1,coss_num,1]
att_score = tf.reshape(tf.nn.softmax(tf.reshape(att, shape=(-1, self.cross_num))),
shape=(-1, self.cross_num, 1)) # [-1,coss_num]
weight_sum = tf.multiply(pi_emb, att_score) # [-1,coss_num,vec_dim]
weight_sum = tf.reduce_sum(weight_sum, axis=1)
return weight_sum
def run():
# 将所有的特征的各个类别值统一id化。x中每行为各特征的类别值的id
val_x, val_y = getAllData(test)
train_x, train_y = getAllData(base)
model = keras.models.Sequential()
model.add(keras.layers.Embedding(FEAT_CATE_NUM, VEC_DIM, input_length=val_x[0].shape[0]))
model.add(PairWiseInteractionAttentionLayer(vec_dim=VEC_DIM, attention_factor=VEC_DIM))
model.add(keras.layers.Dropout(rate=DROPOUT_RATE))
for units in DNN_LAYERS:
model.add(keras.layers.Dense(units, activation='relu'))
model.add(keras.layers.Dropout(DROPOUT_RATE))
model.add(keras.layers.Dense(1, activation='sigmoid'))
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_x, train_y, batch_size=BATCH_SIZE, epochs=EPOCH, verbose=2, validation_data=(val_x, val_y),
callbacks=[tbCallBack])
run()