视频讲解:https://www.yuque.com/chudi/tzqav9/ny150b#aalY8
import tensorflow as tf
import numpy as np
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
base, test = loadData()
FEAT_NUM = base.shape[1] - 1
K = tf.keras.backend
class CrossLayer(keras.layers.Layer):
def __init__(self, feat_num, vec_dim, **kwargs):
self.feat_num = feat_num
self.vec_dim = vec_dim
super(CrossLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.V = self.add_weight(name='V', shape=(self.feat_num, self.vec_dim), initializer='uniform', trainable=True)
super(CrossLayer, self).build(input_shape)
def call(self, inputs, **kwargs):
a = K.pow(K.dot(inputs, self.V), 2)
b = K.dot(K.pow(inputs, 2), K.pow(self.V, 2))
return 0.5 * K.mean(a - b, 1, keepdims=True)
def run():
val_x, val_y = getAllData(test)
train_x, train_y = getAllData(base)
inputs = keras.Input((val_x.shape[1],))
liner = keras.layers.Dense(1)(inputs)
cross = CrossLayer(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', # log 目录
histogram_freq=0, # 按照何等频率(epoch)来计算直方图,0为不计算
# batch_size=32, # 用多大量的数据计算直方图
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()