查看原文
其他

【他山之石】GCN实现及其中的归一化

“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。

作者:知乎—争渡

地址:https://www.zhihu.com/people/zhang-ji-ji-52-41

GCN公式: 
其中  , 
在公式中通过  进行了归一化,为什么要进行归一化?
因为采用加法规则进行聚合时,度大的节点的特征会越来越大,度小的节点的特征会越来越小,所以需要归一化。
比较一下  和  ,前者的结果不是对角阵,而后者是对角阵。
在上式中, 指示 节点  是否为邻居,  是节点  的特征向量,所以  的意思是将 节点  的邻居节点及其自身的特征向量相加,最后取平均。
 
 不仅考虑了自身节点的度,也考虑了邻居节点的度。
在网上找到了pytorch实现的GCN代码pygcn:https://github.com/tkipf/pygcn
模型的实现如下:
layers.py
import math
import torch
from torch.nn.parameter import Parameterfrom torch.nn.modules.module import Module

class GraphConvolution(Module): """ Simple GCN layer, similar to https://arxiv.org/abs/1609.02907 """
def __init__(self, in_features, out_features, bias=True): super(GraphConvolution, self).__init__() self.in_features = in_features self.out_features = out_features self.weight = Parameter(torch.FloatTensor(in_features, out_features)) if bias: self.bias = Parameter(torch.FloatTensor(out_features)) else: self.register_parameter('bias', None) self.reset_parameters()
def reset_parameters(self): stdv = 1. / math.sqrt(self.weight.size(1)) self.weight.data.uniform_(-stdv, stdv) if self.bias is not None: self.bias.data.uniform_(-stdv, stdv)
def forward(self, input, adj): support = torch.mm(input, self.weight) output = torch.spmm(adj, support) if self.bias is not None: return output + self.bias else: return output
def __repr__(self): return self.__class__.__name__ + ' (' \ + str(self.in_features) + ' -> ' \ + str(self.out_features) + ')'
models.py
import torch.nn as nnimport torch.nn.functional as Ffrom layers import GraphConvolution

class GCN(nn.Module): def __init__(self, nfeat, nhid, nclass, dropout): super(GCN, self).__init__()
self.gc1 = GraphConvolution(nfeat, nhid) self.gc2 = GraphConvolution(nhid, nclass) self.dropout = dropout
def forward(self, x, adj): x = F.relu(self.gc1(x, adj)) x = F.dropout(x, self.dropout, training=self.training) x = self.gc2(x, adj) return F.log_softmax(x, dim=1)


本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“他山之石”历史文章


更多他山之石专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存