视频讲解:https://www.yuque.com/chudi/tzqav9/ny150b#aalY8
import tensorflow as tf
from tensorflow import keras
from utils import *
EPOCH = 10
STEP_PRINT = 200
STOP_STEP = 2000
LEARNING_RATE = 1e-4
BATCH_SIZE = 32
LAMDA = 1e-3
VEC_DIM = 10
FIELD_NUM = 5
base, test = loadData()
FEAT_NUM = base.shape[1] - 1
K = tf.keras.backend
class CrossLayer(keras.layers.Layer):
def __init__(self, field_dict, field_dim, feat_num, vec_dim, **kwargs):
self.field_dict = field_dict
self.field_dim = field_dim
self.feat_num = feat_num
self.vec_dim = vec_dim
super(CrossLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.kernel = self.add_weight(name='kernel', shape=(self.feat_num, self.field_dim, self.vec_dim),
initializer='uniform', trainable=True)
super(CrossLayer, self).build(input_shape)
def call(self, inputs, **kwargs):
self.field_cross = K.constant(0, dtype='float32')
for i in range(self.feat_num):
for j in range(i + 1, self.feat_num):
VV = tf.math.reduce_sum(
tf.math.multiply(self.kernel[i, self.field_dict[j]], self.kernel[j, self.field_dict[i]]))
value = tf.math.multiply(VV, tf.math.multiply(inputs[:, i], inputs[:, j]))
self.field_cross += value
def run():
val_x, val_y = getAllData(test)
train_x, train_y = getAllData(base)
field_dict = getFieldMap(base.columns.values.tolist())
inputs = keras.Input((val_x.shape[1],))
liner = keras.layers.Dense(1)(inputs)
cross = CrossLayer(field_dict, FIELD_NUM, FEAT_NUM, VEC_DIM)(inputs)
add = keras.layers.Add()([liner, cross])
predictions = keras.layers.Activation('sigmoid')(add)
model = keras.Model(inputs, predictions)
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()