背景 : 弄懂Graph Convolution Network的pytorch代码如何加载数据并且如何定义网络结构的。

代码地址:https://github.com/tkipf/pygcn

论文地址:https://arxiv.org/abs/1609.02907 Semi-Supervised Classification with Graph Convolutional Networks,ICLR 2017

目录

一、模型结构定义

1.1 调用位置

1.2 输入参数

1.3 GCN定义

1.4 网络结构(核心)

二、图卷积层Graph convolution

2.1 层初始化定义

2.2 初始化权重

2.3 前馈运算

三、加载数据

3.1 数据格式

content file

cites file

3.2 content file的读取

3.3 cites的读取

3.4 运算symmetric adjacency matrix

3.5 数据集分割


一、模型结构定义

1.1 调用位置

train.py之中,调用模型

# Model and optimizer
model = GCN(nfeat=features.shape[1],nhid=args.hidden,nclass=labels.max().item() + 1,dropout=args.dropout)
optimizer = optim.Adam(model.parameters(),lr=args.lr, weight_decay=args.weight_decay)

1.2 输入参数

代码models.py之中,

  • 第一个参数为底层节点的参数,feature的个数
  • nhid,隐层节点个数
  • nclass,最终的分类数
  • dropout
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

1.3 GCN定义

  • gc1输入尺寸nfeat,输出尺寸nhid
  • gc2输入尺寸nhid,输出尺寸ncalss

1.4 网络结构(核心)

此部分,需要结合论文与代码一同理解其结构,此部分也是论文和代码关于网络结构的核心。需要详细查阅pytorch的函数才能弄懂,后续再来查。

结合论文,此公式为:

  • 隐层的feature maps的数量为H,输入层数量为C,输出层为F
  • 其中A为下面3.4中提到的symmetric adjacency matrix,
  • 权重为输入层到隐层的权值矩阵
  • 同理,权重为隐层到输出层的权值矩阵
  • 这个公式跟BP有点像,只不过比BP多了一个稀疏的adj matrix A

代码之中就是这样:

    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)
  • gc1后接一个relu激活
  • x进行dropout
  • 然后x与adj通过gc2
  • 通过softmax回归得到最终的输出

二、图卷积层Graph convolution

2.1 层初始化定义

输入feature,输出feature,权重,偏移。

依然存在一个问题,不太熟悉pytorch的架构及代码,后续一个一个查阅。

    def __init__(self, in_features, out_features, bias=True):super(GraphConvolution, self).__init__()self.in_features = in_featuresself.out_features = out_featuresself.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()

2.2 初始化权重

初始化为均匀分布。

    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)

2.3 前馈运算

论文之中,就是三个矩阵相乘

input X与权重W相乘,然后adj矩阵与 他们的积稀疏乘。

  • 直接输入与权重之间进行torch.mm操作,得到support,即XW
  • support与adj进行torch.spmm操作,得到output,即AXW
  • 选择是否加bias
    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.biaselse:return output

三、加载数据

3.1 数据格式

这是我们第一次面对图结构的数据,因此需要弄懂图结构的数据如何读出,如何进入网络之中的。关于数据集的数据的格式,我们前面有看过数据集的格式。

https://github.com/tkipf/pygcn/tree/master/data/cora

Graph Convolution Network图卷积网络PyTorch代码(一)概览与训练运行

content file

每行包含下面几项:

<paper_id> <word_attributes>+ <class_label>

第一列为paper ID,后面几列为每个单词出现与否,用0与1表示,最后一列为类别标签。

 

cites file

表示论文之间的引用关系(由此看来这个图是有向图)

<ID of cited paper> <ID of citing paper>

前面为被引论文的ID,后面为引用前面的论文的ID

887  6215
887 64519
887 87363
887 976334
906 1103979
906 1105344
906 1114352
906 1136397

3.2 content file的读取

content file的每一行的格式为 : <paper_id> <word_attributes>+ <class_label>

feature为第二列到倒数第二列,labels为最后一列。

    idx_features_labels = np.genfromtxt("{}{}.content".format(path, dataset),dtype=np.dtype(str))features = sp.csr_matrix(idx_features_labels[:, 1:-1], dtype=np.float32)labels = encode_onehot(idx_features_labels[:, -1])

3.3 cites的读取

cites file的每一行格式为:  <cited paper ID>  <citing paper ID>

根据前面的contents与这里的cites创建图,算出edges矩阵与adj 矩阵。

    # build graphidx = np.array(idx_features_labels[:, 0], dtype=np.int32)idx_map = {j: i for i, j in enumerate(idx)}edges_unordered = np.genfromtxt("{}{}.cites".format(path, dataset),dtype=np.int32)edges = np.array(list(map(idx_map.get, edges_unordered.flatten())),dtype=np.int32).reshape(edges_unordered.shape)adj = sp.coo_matrix((np.ones(edges.shape[0]), (edges[:, 0], edges[:, 1])),shape=(labels.shape[0], labels.shape[0]),dtype=np.float32)

矩阵的定义如下:

3.4 运算symmetric adjacency matrix

运算为 symmetric adjacency matrix的格式,具体需要参阅原论文与代码搞懂此矩阵到底如何得来的。

论文之中对symmetric adjacency matrix的描述为:

    # build symmetric adjacency matrixadj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)features = normalize(features)adj = normalize(adj + sp.eye(adj.shape[0]))

3.5 数据集分割

分割为train,val,test三个集

最终数据加载为torch的格式并且分成三个数据集

    idx_train = range(140)idx_val = range(200, 500)idx_test = range(500, 1500)features = torch.FloatTensor(np.array(features.todense()))labels = torch.LongTensor(np.where(labels)[1])adj = sparse_mx_to_torch_sparse_tensor(adj)idx_train = torch.LongTensor(idx_train)idx_val = torch.LongTensor(idx_val)idx_test = torch.LongTensor(idx_test)

Graph Convolution Network图卷积网络(二)数据加载与网络结构定义相关推荐

  1. GCN (Graph Convolutional Network) 图卷积网络

    这几个同时看一下,感觉能理解不少: B站视频:https://www.bilibili.com/video/BV1ta4y1t7EK GCN论文原文和代码:https://github.com/tki ...

  2. Paging3、Room使用,1、从本地Room数据库加载 2、直接网络获取数据加载 3、网络访问数据到Room数据库再加载 4、封装使用

    目录 1.从本地Room数据库加载数据 viewmodel fragment中使用 页面 数据库相关 2.直接网络获取数据加载 3.网络访问数据到Room数据库再加载数据 自定义RemoteMedia ...

  3. GAT - Graph Attention Network 图注意力网络 ICLR 2018

    文章目录 1 相关介绍 GCN的局限性 本文贡献(创新点) attention 引入目的 相关工作 谱方法 spectral approaches 非谱方法 non-spectral approach ...

  4. Graph Convolutional Network (图卷积GCN)

    目标:为了解决非规则数据结构 - 学习图上特征映射 直觉上想要找到构图结点的特征,一定是与其相关的结点.连接的边有关.那么就直接把每个顶点比如1号结点相邻的结点找出来,虽然相邻的个数可能不一样,设个最 ...

  5. 【论文导读】- EvolveGCN: Evolving Graph Convolutional Networks for Dynamic Graphs(EvolveGCN:用于动态图的演化图卷积网络)

    文章目录 论文信息 摘要 evolving graph convolutional network 图卷积网络 (GCN) 权重更新 Evolving Graph Convolution Unit ( ...

  6. DWZ 用dialog调用MVC自动生成的密码修改页面一直出现“数据加载中,请稍等...”和去掉“数据加载中,请稍等”的方法

    在MVC框架中调用JS框架<DWZ富客户端框架>在用dialog调用自动MVC系统自动生成的密码修改页面一直出现"数据加载中,请稍等..."的问题. <a tit ...

  7. 图卷积网络GCN(Graph Convolution Network)(一)研究背景和空域卷积

    文章首发于个人站点: 图卷积网络GCN(Graph Convolution Network)(一)研究背景和空域图卷积 | 隐舍 公众号:[DreamHub] 由于文章篇幅较长,因此将其分解为三部分: ...

  8. 论文翻译 SGCN:Sparse Graph Convolution Network for Pedestrian Trajectory Prediction 用于行人轨迹预测的稀疏图卷积网络

    SGCN:Sparse Graph Convolution Network for Pedestrian Trajectory Prediction 用于行人轨迹预测的稀疏图卷积网络 行人轨迹预测是自 ...

  9. 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导

    文章目录 1. 为什么会出现图卷积神经网络? 2. 图卷积网络的两种理解方式 2.1 vertex domain(spatial domain):顶点域(空间域) 2.2 spectral domai ...

最新文章

  1. Memcached 集群环境Java客户端
  2. Node.js获取mac网卡地址
  3. wps中的相交_【研途技能贴】| WPS里的布尔运算
  4. 朴素贝叶斯算法实现分类以及Matlab实现
  5. 异或!!不占用额外空间!!
  6. 资源不足的情况怎么设置sparkrdd并行度_监控录像机资源不足或达到上限的原因及解决方法!...
  7. dart string 转 bool_Dart语法篇之集合操作符函数与源码分析(三)
  8. 2012禁用ip隧道 win_Windows 7下关闭IPV6隧道的技巧方法
  9. POJ3253 Fence Repair【哈夫曼树+优先队列】
  10. SRMD:Learning a Single Convolutional Super-Resolution Network for Multiple Degradations
  11. linux在当前目录 查找abc文件夹,《find技巧》-“linux命令五分系列”之一
  12. 位图上下文 裁剪图片成一个圆形的头像
  13. Unity的AudioMixer真香?
  14. 12.14黄金白银实时行情分析,黄金原油解套操作策略
  15. java 返回ro,错误retrofit rxjava优雅的处理服务器返回异常、错误
  16. Flutter 全能型选手GetX —— 状态管理
  17. Linux 获取毫秒级时间戳
  18. 2019前端最全面试题
  19. 201571030301/201571030302《小学生四则运算练习软件》结对项目报告
  20. 最新防伪和代{过}{滤}理授权查询系统网站源码V1.3

热门文章

  1. 基于51单片机的霓虹灯c语言,基于51单片机霓虹灯.pdf
  2. 中国垃圾分类产业链现状动态及未来发展前景预测报告(2022-2027年)
  3. 大数据专业适合考研吗?
  4. 中国人唯一不认可的成功——就是家庭的和睦,人生的平淡(做为程序员的我们又追求什么样的人生呢?)值得思考???
  5. 动态多目标进化优化研究进展
  6. 【Vue.js】Vue.js组件库Element中的图片、回到顶部、无限滚动和抽屉
  7. Vue-V-model参数绑定
  8. bootstrapTable 应用小例(收索)
  9. CSDN花里胡哨的自定义模板
  10. 如何取消共享计算机管理员权限设置密码,Win7旗舰版系统共享文件夹设置密码如何设置...