(DataWhale)图神经网络Task01:基于PyG包的图数据的表示与使用
文章目录
- PyG`Data`类初识
- `graph_data`对象的创建:
- `graph_data`实例初探
- PyG`Dataset`类初识
- 内置数据集(Cora)的下载
- 作业1
PyGData
类初识
graph_data
对象的创建:
- 通过
torch_geometric.data.Data
构造函数,即graph_data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y, num_nodes=num_nodes, other_attr=other_attr)
。 - 使用
Data
将一个dict
对象转换为一个Data
对象,即graph_data = Data.from_dict(graph_dict)
。
Data
中的edge_index属性表示COO格式的边索引矩阵,大小为[2, num_edges]
。简单来说,也就是只存储图邻接矩阵中的非零值,即不同节点间存在的边。edge_index矩阵第0行表示尾节点,第1行表示头节点,边从头指向尾,示例见下图:图的邻接矩阵:使用方阵A表示有n个顶点构成的图。
- 对于有向图,行索引为头,列索引为尾,头指向尾,即邻接矩阵的第i 行非零元素的个数正好是第i 个顶点的出度。
稀疏矩阵的存储格式:COO、CSR、CSC。
- COO:使用三个数组row,column和data分别用来存储非零元素坐标的row_index,col_index,以及数值;
- CSR:对COO稀疏矩阵存储格式的三个数组中的row数组进行压缩,其他两个数组保持不变。三个数组分别是row_ptr,columns和data,其中,row_ptr长度为M+1(M为稀疏矩阵行数),第i行的非零元素有**row_ptr[i+1]-row_ptr[i]**个,为data[row_ptr[i]:row_ptr[i+1]];
- CSC:对COO稀疏矩阵存储格式的column数组进行压缩,其他两个数组保持不变。
graph_data
实例初探
Zachary karate club网络是通过对一个美国大学空手道俱乐部进行观测而构建出的一个社会网络,网络包含 34 个节点和 78 条边,其中节点表示俱乐部中的成员,而边表示成员之间存在的友谊关系。
from torch_geometric.datasets import KarateClubdataset = KarateClub()
data = dataset[0] # Get the first graph object.
print(data)
# Data(edge_index=[2, 156], train_mask=[34], x=[34, 34], y=[34])
# x=[34, 34]:34个节点,节点属性的维度为34
# edge_index=[2, 156]:156条边,矩阵第0行表示尾节点,第1行表示头节点,边从头指向尾。
print('==============================================================')# 显示图的部分属性信息
print(f'节点数量: {data.num_nodes}')
print(f'边数量: {data.num_edges}')
print(f'节点属性的维度: {data.num_node_features}')
print(f'节点属性的维度: {data.num_features}')
print(f'边属性的维度: {data.num_edge_features}')
print(f'平均节点度: {data.num_edges / data.num_nodes:.2f}')
print(f'边是否有序且不含重复边: {data.is_coalesced()}')
print(f'用作训练集的节点: {data.train_mask.sum()}')
print(f'是否包含孤立的节点: {data.contains_isolated_nodes()}')
print(f'是否包含自环的边: {data.contains_self_loops()}')
print(f'是否是无向图: {data.is_undirected()}')
PyGDataset
类初识
内置数据集(Cora)的下载
from torch_geometric.datasets import Planetoid# 程序先下载原始文件,然后将原始文件处理成包含`Data`对象的`Dataset`对象并保存到文件
dataset = Planetoid(root='/dataset', name='Cora')
上述过程报错:内置下载地址无法访问“https://github.com/kimiyoung/planetoid/raw/master/data/";
解决办法:
自行下载数据(‘https://github.com/kimiyoung/planetoid/tree/master/data’ or ‘https://gitee.com/jiajiewu/planetoid/tree/master/data’),并放置到正确位置‘/dataset/Cora/raw’;
暂时屏蔽planetoid.py中的down_load()函数;
运行原代码,成功。
作业1
请通过继承Data
类实现一个类,专门用于表示“机构-作者-论文”的网络。该网络包含“机构“、”作者“和”论文”三类节点,以及“作者-机构“和“作者-论文“两类边。对要实现的类的要求:1)用不同的属性存储不同节点的属性;2)用不同的属性存储不同的边(边没有属性);3)逐一实现获取不同节点数量的方法。
Python类继承
参考自:https://www.cnblogs.com/bigberg/p/7182741.html
python3中所有类都可以继承于object基类;
父类定义:
class FooParen(object)
;子类继承:class FooChild(FooParen)
;在定义子类的构造函数时,要先继承再构造,这样才能获取父类的属性(Python 3 可以使用直接使用
super().xxx
代替super(Class, self).xxx
)。子类构造函数继承父类构造函数过程如下:实例化对象c --> c 调用子类__init__() -- > 子类__init__()继承父类__init__() -- > 调用父类 __init__()
;使用super函数时,可将子类中与父类相同的参数依次写入
__init__(xxx)
的xxx参数中,self参数已在super()
中传入,在__init__()
中将隐式传递,不需要写出;class FooParent(object):def __init__(self):self.parent = 'I\'m the parent.'print ('Parent')def bar(self,message):print ("%s from Parent" % message)class FooChild(FooParent):def __init__(self):# super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类 FooChild 的对象转换为类 FooParent 的对象super(FooChild,self).__init__() print ('Child')def bar(self,message):super(FooChild, self).bar(message)print ('Child bar fuction')print (self.parent)if __name__ == '__main__':fooChild = FooChild()fooChild.bar('HelloWorld')
import torch
from torch_geometric.data import Data
import loggingclass SchData(Data):def __init__(self, x=None, edge_index=None, node_types=None, edge_types=None, **kwargs):''':param node_types: [num_nodes, 1]:param edge_types: [num_edges, 1] or None,不提供关系属性时可由节点、节点属性、关系属性推断得知;'''super().__init__(x, edge_index, **kwargs)self.node_types = node_typesself.edge_types = edge_typesself.nodes = torch.cat((x, node_types.T), dim=1)self.orgs, self.auts, self.paps = self.stastics()def stastics(self):org, aut, pap = [], [], []for idx, type in enumerate(self.nodes[:, 2]):if type == 0:org.append(idx)elif type == 1:aut.append(idx)elif type == 2:pap.append(idx)else:logging.warning('There is a node of unknown type!')return org, aut, pap@propertydef node_org(self):# 机构节点print('Number of organizations: {}'.format(len(self.orgs)))return self.nodes[[idx for idx in self.orgs], :-1]@propertydef node_aut(self):# 作者节点print('Number of authors: {}'.format(len(self.auts)))return self.nodes[[idx for idx in self.auts], :-1]@propertydef node_pap(self):# 论文节点print('Number of papers: {}'.format(len(self.paps)))return self.nodes[[idx for idx in self.paps], :-1]@propertydef edge_classify(self):edge_10 = []edge_12 = []if self.edge_types is not None:for idx, type in enumerate(self.edge_types[0]):if type == 0: #0-作者&机构(1-0)edge_10.append(tuple(self.edge_index[:, idx].numpy().tolist()))elif type == 1: #1-作者&论文(1-2)edge_12.append(tuple(self.edge_index[:, idx].numpy().tolist()))else:logging.warning('There is a edge of unknown type!')return '作者-机构:', edge_10, '作者-论文:', edge_12else:# TODO# 若不提供关系属性也可由节点、节点属性、关系属性推断得知passif __name__ == '__main__':x = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1]]) # (7,2)edge_index = torch.tensor([[0, 0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6],[2, 3, 4, 0, 5, 6, 0, 5, 1, 6, 2, 3, 2, 4]]) # (2,14)node_types = torch.tensor([[0, 0, 1, 1, 1, 2, 2]]) # 0-机构,1-作者,2-论文edge_types = torch.tensor([[0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1]]) # 0-作者&机构,1-作者&论文# num_nodes = 7 # 不提供的话Data.num_nodes()函数会根据x自动计算data = SchData(x=x, edge_index=edge_index, node_types=node_types, edge_types=edge_types)print(data)print('==============================================================')# 获取图的一些信息print(f'Number of nodes: {data.num_nodes}') # 节点数量print(f'Number of edges: {data.num_edges}') # 边数量print(f'Number of node features: {data.num_node_features}') # 节点属性的维度print(f'Number of edge features: {data.num_edge_features}') # 边属性的维度print(f'Organization node features: {data.node_org}') # 机构节点计数及属性print(f'Author node features: {data.node_aut}') # 作者节点计数及属性print(f'Ppaper node features: {data.node_pap}') # 论文节点计数及属性print(f'Edge categories: {data.edge_classify}') # 边类型# 结果输出:
# SchData(auts=[3], edge_index=[2, 14], edge_types=[1, 14], node_types=[1, 7], nodes=[7, 3], orgs=[2], paps=[2], x=[7, 2])
# ==============================================================
# Number of nodes: 7
# Number of edges: 14
# Number of node features: 2
# Number of edge features: 0
# Number of organizations: 2
# Organization node features: tensor([[0, 0], [0, 1]])
# Number of authors: 3
# Author node features: tensor([[1, 0], [1, 1], [1, 2]])
# Number of papers: 2
# Ppaper node features: tensor([[2, 0], [2, 1]])
# Edge categories: ('作者-机构:', [(0, 2), (0, 3), (1, 4), (2, 0), (3, 0), (4, 1)],
# '作者-论文:', [(2, 5), (2, 6), (3, 5), (4, 6), (5, 2), (5, 3), (6, 2), (6, 4)])
(DataWhale)图神经网络Task01:基于PyG包的图数据的表示与使用相关推荐
- 图神经网络基础--基于图神经网络的节点表征学习
图神经网络基础–基于图神经网络的节点表征学习 引言 在图节点预测或边预测任务中,首先需要生成节点表征(Node Representation).我们使用图神经网络来生成节点表征,并通过基于监督学习的对 ...
- 图神经网络 | Python基于GNN和ARIMA的时间序列预测
图神经网络 | Python基于GNN和ARIMA的时间序列预测 目录 图神经网络 | Python基于GNN和ARIMA的时间序列预测 基本描述 程序实现 参考资料 基本描述 时间序列预测 一个基于 ...
- 图神经网络的过平滑问题和图残差网络
图神经网络的过平滑问题和图残差网络 在GNN的深度堆叠中存在两大问题:梯度消失和过平滑.梯度消失是经典神经网络中就会出现的问题,也就是当网络层数堆叠地过多,前面的层梯度过小难以更新:另一个问题就是之前 ...
- 【图神经网络】基于GNN的不同变种及其应用
图神经网络 图神经网络(Graph Neural Network,GNN)最早由 Scarselli 等人提出.图中的一个节点可以通过其特征和相关节点进行定义,GNN 的目标是学习一个状态嵌入 用于表 ...
- 图神经网络代码_第一篇:图神经网络(GNN)计算框架绪论
写在开头: 这个专栏是为了总结我本科毕业设计中所设计的题目<基于GPU的图神经网络算法库的设计钰实现>.这半年来一直在这个方向上啃代码,读论文,真的学到了很多东西.尤其是阅读了大佬团队写的 ...
- 【图神经网络实战】深入浅出地学习图神经网络GNN(上)
文章目录 一.图神经网络应用领域 1.1 芯片设计 1.2 场景分析与问题推理 1.3 推荐系统 1.4 欺诈检测与风控相关 1.5 知识图谱 1.6 道路交通的流量预测 1.7 自动驾驶(无人机等场 ...
- 图神经网络笔记(二)——卷积图神经网络概述
文章目录 基于谱分解的方法 Spectral Network ChebNet GCN AGCN(Adaptive GCN) 基于空间结构的方法 Neural FP PATCHY-SAN DGCN LG ...
- 图神经网络应用——基于深度学习的图相似度计算(以SIMGNN为例的保姆级讲解)
为啥想写这篇文章呢..因为之前提到的图神经网络应用篇鸽了一年多了,把自己的研究方向做一个总结,并向其他同样研究方向的朋友做一个报告,如有错误,敬请指出.而且,这个研究方向人太少了,万望能借此引起更多人 ...
- 《深入浅出图神经网络》读书笔记(5.图信号处理与图卷积神经网络)
文章目录 5.图信号处理与图卷积神经网络 5.1 矩阵乘法 5.2 图信号与图的拉普拉斯矩阵 5.3 图傅里叶变换 5.4 图滤波器 5.4.1 空域角度 5.4.2 频域角度 5.5 图卷积神经网络 ...
最新文章
- Java设计模式之行为型:策略模式
- Visio 方向工程连接 Oracle 10G
- Spring 学习——Spring AOP——AOP配置篇Advice(有参数传递)
- 冷热复位_冷热rx-java可观察
- 【 HDU - 5363】Key Set(水题,快速幂,组合数学)
- Linux下shellcode编写
- 基础算法:与、或、异或运算
- TVS ESD 二极管介绍与应用
- java json jquery_JQuery提交JSON string数据
- markdown测试文章
- 开源免费语音识别引擎 RapidASR
- MPU6050数据分析
- 系统坏了用u盘怎么重装系统
- python输入一个浮点数、输出其整数部分和小数部分_输入一个浮点数,并输出该数的整数部分和小数部分...
- python函数体里的if...else...与return语句
- html5半径,化学元素原子半径大小比较
- 国内哪家云服务器最便宜?国内主流三大云厂商的价格差异
- c语言怎么把一个整数挨挨挤挤,《C语言》课程PPT_第1章_C语言基础
- zucc c语言上机答案,ZUCC第三章 习题答案.doc
- IBM CRL实习感受