Source code for gammagl.models.vgae

import tensorlayerx as tlx
import tensorlayerx.nn as nn

from gammagl.layers.conv import GCNConv


[docs] class VGAEModel(tlx.nn.Module): r"""Applications of Variational Encoders on Graphs proposed in `Variational Graph Auto-Encoders <https://arxiv.org/pdf/1611.07308.pdf>`_ paper. Parameters ---------- feature_dim: int input feature dimension. hidden1_dim: int hidden dimension. hidden2_dim: int output dimension. drop_rate: float, optional dropout rate. num_layers: int, optional number of layers. norm: str, optional apply the normalizer. name: str, optional model name. """ def __init__(self, feature_dim, hidden1_dim, hidden2_dim, drop_rate=0., num_layers=2, norm='none', name=None): super().__init__(name=name) self.conv1 = GCNConv(feature_dim, hidden1_dim, norm=norm) self.conv_mu = GCNConv(hidden1_dim, hidden2_dim, norm=norm) self.conv_logstd = GCNConv(hidden1_dim, hidden2_dim, norm=norm) self.dc = InnerProductDecoder() self.relu = tlx.ReLU() self.dropout = tlx.layers.Dropout(drop_rate)
[docs] def encode(self, x, edge_index, edge_weight, num_nodes): x = self.conv1(x, edge_index, edge_weight, num_nodes) x = self.relu(x) x = self.dropout(x) mu = self.conv_mu(x, edge_index, edge_weight, num_nodes) logstd = self.conv_logstd(x, edge_index, edge_weight, num_nodes) return mu, logstd
[docs] def reparameterize(self, mu, logstd): std = tlx.exp(logstd) eps = tlx.random_normal((std.shape[0], std.shape[1])) z = mu + tlx.multiply(std, eps) return z
[docs] def forward(self, x, edge_index, edge_weight, num_nodes): mu, logstd = self.encode(x, edge_index, edge_weight, num_nodes) z = self.reparameterize(mu, logstd) return self.dc(z), mu, logstd
[docs] class GAEModel(tlx.nn.Module): r""" Applications of Auto-Encoders on Graphs proposed in `"Variational Graph Auto-Encoders" <https://arxiv.org/pdf/1611.07308.pdf>`_ paper. Parameters ---------- feature_dim: int input feature dimension. hidden1_dim: int hidden dimension. hidden2_dim: int output dimension. drop_rate: float dropout rate. num_layers: int number of layers. norm: str apply the normalizer. name: str model name. """ def __init__(self, feature_dim, hidden1_dim, hidden2_dim, drop_rate=0., num_layers=2, norm='none', name=None): super().__init__(name=name) self.conv1 = GCNConv(feature_dim, hidden1_dim, norm=norm) self.conv2 = GCNConv(hidden1_dim, hidden2_dim, norm=norm) self.dc = InnerProductDecoder() self.relu = tlx.ReLU() self.dropout = tlx.layers.Dropout(drop_rate)
[docs] def encode(self, x, edge_index, edge_weight, num_nodes): x = self.conv1(x, edge_index, edge_weight, num_nodes) x = self.relu(x) x = self.dropout(x) mu = self.conv2(x, edge_index, edge_weight, num_nodes) return mu
[docs] def forward(self, x, edge_index, edge_weight, num_nodes): mu = self.encode(x, edge_index, edge_weight, num_nodes) return self.dc(mu), mu, 1
class InnerProductDecoder(tlx.nn.Module): def __init__(self, drop_rate=0.): super(InnerProductDecoder, self).__init__() self.sigmoid = tlx.Sigmoid() self.dropout = tlx.layers.Dropout(drop_rate) def forward(self, z): z = self.dropout(z) zt = tlx.transpose(z) adj = tlx.matmul(z, zt) #adj = self.sigmoid(adj) return adj