You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
7.5 KiB

2 years ago
from layers import GraphConvolution, GraphConvolutionSparse, InnerProductDecoder
import tensorflow as tf
flags = tf.app.flags
FLAGS = flags.FLAGS
2 years ago
2 years ago
class Model(object):
def __init__(self, **kwargs):
allowed_kwargs = {'name', 'logging'}
for kwarg in kwargs.keys():
assert kwarg in allowed_kwargs, 'Invalid keyword argument: ' + kwarg
for kwarg in kwargs.keys():
assert kwarg in allowed_kwargs, 'Invalid keyword argument: ' + kwarg
name = kwargs.get('name')
if not name:
name = self.__class__.__name__.lower()
self.name = name
logging = kwargs.get('logging', False)
self.logging = logging
self.vars = {}
def _build(self):
raise NotImplementedError
def build(self):
""" Wrapper for _build() """
with tf.variable_scope(self.name):
self._build()
variables = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=self.name)
self.vars = {var.name: var for var in variables}
def fit(self):
pass
def predict(self):
pass
class GCN(Model):
def __init__(self, placeholders, num_features, features_nonzero, **kwargs):
super(GCN, self).__init__(**kwargs)
"""
inputs:输入
input_dim:feature的数量即input的维度
feature_nonzero非0的特征
adj:邻接矩阵
dropoutdropout
"""
self.inputs = placeholders['features']
self.input_dim = num_features
self.features_nonzero = features_nonzero
self.adj = placeholders['adj']
self.dropout = placeholders['dropout']
2 years ago
def construct(self, inputs=None, hidden=None, reuse=False):
if inputs == None:
2 years ago
inputs = self.inputs
2 years ago
2 years ago
with tf.variable_scope('Encoder', reuse=reuse):
self.hidden1 = GraphConvolutionSparse(input_dim=self.input_dim,
output_dim=FLAGS.hidden1,
adj=self.adj,
2 years ago
features_nonzero=self.features_nonzero,
2 years ago
act=tf.nn.relu,
dropout=self.dropout,
logging=self.logging,
name='e_dense_1')(inputs)
2 years ago
2 years ago
self.noise = gaussian_noise_layer(self.hidden1, 0.1)
if hidden == None:
hidden = self.hidden1
self.embeddings = GraphConvolution(input_dim=FLAGS.hidden1,
2 years ago
output_dim=FLAGS.hidden2,
adj=self.adj,
act=lambda x: x,
dropout=self.dropout,
logging=self.logging,
name='e_dense_2')(hidden)
2 years ago
self.z_mean = self.embeddings
self.reconstructions = InnerProductDecoder(input_dim=FLAGS.hidden2,
2 years ago
act=lambda x: x,
logging=self.logging)(self.embeddings)
2 years ago
return self.z_mean, self.reconstructions
class Generator_z2g(Model):
def __init__(self, placeholders, num_features, features_nonzero, **kwargs):
super(Generator_z2g, self).__init__(**kwargs)
"""
inputs:输入
input_dim:feature的数量即input的维度
feature_nonzero非0的特征
adj:邻接矩阵
dropoutdropout
"""
self.inputs = placeholders['real_distribution']
self.input_dim = num_features
self.features_nonzero = features_nonzero
self.adj = placeholders['adj']
self.dropout = placeholders['dropout']
2 years ago
def construct(self, inputs=None, reuse=False):
2 years ago
if inputs == None:
inputs = self.inputs
with tf.variable_scope('Decoder', reuse=reuse):
self.hidden1 = GraphConvolution(input_dim=FLAGS.hidden2,
2 years ago
output_dim=FLAGS.hidden1,
adj=self.adj,
act=tf.nn.relu,
dropout=self.dropout,
logging=self.logging,
name='GG_dense_1')(inputs)
2 years ago
self.embeddings = GraphConvolution(input_dim=FLAGS.hidden1,
2 years ago
output_dim=self.input_dim,
adj=self.adj,
act=lambda x: x,
dropout=self.dropout,
logging=self.logging,
name='GG_dense_2')(self.hidden1)
2 years ago
self.z_mean = self.embeddings
2 years ago
return self.z_mean, self.hidden1
2 years ago
def dense(x, n1, n2, name):
"""
Used to create a dense layer.
:param x: input tensor to the dense layer
:param n1: no. of input neurons
:param n2: no. of output neurons
:param name: name of the entire dense layer.i.e, variable scope name.
:return: tensor with shape [batch_size, n2]
"""
with tf.variable_scope(name, reuse=None):
# np.random.seed(1)
tf.set_random_seed(1)
weights = tf.get_variable("weights", shape=[n1, n2],
initializer=tf.random_normal_initializer(mean=0., stddev=0.01))
bias = tf.get_variable("bias", shape=[n2], initializer=tf.constant_initializer(0.0))
out = tf.add(tf.matmul(x, weights), bias, name='matmul')
return out
class D_graph(Model):
def __init__(self, num_features, **kwargs):
super(D_graph, self).__init__(**kwargs)
self.act = tf.nn.relu
self.num_features = num_features
2 years ago
def construct(self, inputs, reuse=False):
2 years ago
# input是一张Graph的adj,把每一列当成一个通道,所以input的通道数是num_nodes
with tf.variable_scope('D_Graph'):
if reuse:
tf.get_variable_scope().reuse_variables()
# np.random.seed(1)
2 years ago
# tf.set_random_seed(1)
dc_den1 = tf.nn.relu(dense(inputs, self.num_features, 512, name='GD_den1')) # (bs,num_nodes,512)
dc_den2 = tf.nn.relu(dense(dc_den1, 512, 128, name='GD_den2')) # (bs, num_nodes, 128)
output = dense(dc_den2, 128, 1, name='GD_output') # (bs,num_nodes,1)
2 years ago
return output
2 years ago
2 years ago
def gaussian_noise_layer(input_layer, std):
noise = tf.random_normal(shape=tf.shape(input_layer), mean=0.0, stddev=std, dtype=tf.float32)
2 years ago
return input_layer + noise
2 years ago
class Discriminator(Model):
def __init__(self, **kwargs):
super(Discriminator, self).__init__(**kwargs)
self.act = tf.nn.relu
2 years ago
def construct(self, inputs, reuse=False):
2 years ago
# with tf.name_scope('Discriminator'):
with tf.variable_scope('Discriminator'):
if reuse:
tf.get_variable_scope().reuse_variables()
# np.random.seed(1)
tf.set_random_seed(1)
dc_den1 = tf.nn.relu(dense(inputs, FLAGS.hidden2, FLAGS.hidden3, name='dc_den1'))
dc_den2 = tf.nn.relu(dense(dc_den1, FLAGS.hidden3, FLAGS.hidden1, name='dc_den2'))
output = dense(dc_den2, FLAGS.hidden1, 1, name='dc_output')
2 years ago
return output