图神经网络—lesson1—pyG库的安装与简单图论

1. 写在前面

先在这里给datawhale做一个推广吧,本期组队学习内容:
https://github.com/datawhalechina/team-learning-nlp/tree/master/GNN

时隔两个月,再次开始组队学习,还是有些不习惯的。报名这次组队学习一方面是自己对这方面知识还算感兴趣(无非就是没学过,图个新鲜,每次学习都不够深入)。另一方面也是想改变一下目前比较松懈的生活方式。本次学习我要好好学了!!!(flag从来就是用来打破的)

2. 简单图论

参考来源:https://blog.csdn.net/u012734723/article/details/78149299

这部分,数据结构基础知识,但是,这部分内容不介绍的话,很难理解后面的知识,本着博客完整性的原则,还是需要简单说一下。当然,我之前学习的图论,也仅限于数据结构上的图,至于本次和神经网络进行结合的图神经网络,还是不甚了解,所以参考了大佬们的资料,进行一定的总结。

在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。
在这里插入图片描述
图的类型:
无向图:图的边没有方向。
有向图:图的边有方向。
完全图:图的边数达到最大值。无向完全图的边数为n*(n-1)/2,有向完全图的边数为n*(n-1)。
带权图:图的边具有权值。

图的属性:

邻接顶点:若(vi,vj)是无向图E(G)中的一条边,则称vi和vj互为邻接顶点。

:与顶点vi关联的边数。度为0的称为孤立点,度为1的称为悬挂点。在有向图中,以vi为终点的度称为vi的入度,以vi为起点的度称为vi的出度。

子图:设图G=(V,E),G’=(V’,E’),若V’∈V,E’∈E,则称G’是G的子图。如果G’≠G,则称图G’是G的真子图。若G’是G的子图,且V=V’,称图G’是图G的生成子图。

路径:若存在顶点序列(vi,vp1,vp2,…,vpm,vj)且边(vi,vp1)、(vp1,vp2)、…、(vpm,vj)都是E(G)的边,则称顶点序列(vi,vp1,vp2,…,vpm,vj)是从顶点vi到vj的一条路径。对于不带权图,路径长度指该路径上的边数;对于带权图,路径长度指该路径上各条边的权值之和。

连通性:在无向图G中,若从顶点vi到vj有路径,则称vi和vj是连通的。若图G中任意一对顶点vi和vj(vi≠vj)都是连通的,则称G为连通图。非连通图的极大连通子图称为该图的连通分量。在有向图中,若在每对顶点vi和vj(vi≠vj)之间都存在一条从vi到vj的路径,也存在一条从vj到vi的路径,则称该图是强连通图。非强连通图的极大强连通子图称为该图的强连通分量。

图的存储形式:
存储一个图包括存储顶点集合和边集合。顶点集合采用顺序表存储,而边集合可以采用邻接矩阵,邻接表等存储结构。

(1)边集合采用邻接矩阵的形式存储。

a.不带权值的邻接矩阵的表示
在这里插入图片描述
如果顶点A到顶点B之间有边,则A[A][B] = 1,否则 A[A][B] = 0。

b.带权值的邻接矩阵的表示
在这里插入图片描述

(2)边集合采用邻接表的形式存储
在这里插入图片描述

3. 环境配置与pyG库的安装

首先,感谢(https://blog.csdn.net/qq_41937140?spm=1001.2014.3001.5509)小可爱的帮助,虽然她的主页什么也没有。帮助我认识到了conda环境的多样性。其实在这部分还是费了点功夫的,因为之前我的anaconda的pip出了问题,后来又重装了anaconda,但是两次anaconda不是同一个路径。结果导致anaconda的base环境都有两个。而pip安装的环境在本机环境,这就造成了实际上三个环境同时存在。后续学习者们,可以适当注意一下这个问题。废话少说,还是一点点来说吧。

①首先,使用“nvidia-smi”命令,查看一下自己的显卡驱动是否正确安装:
在这里插入图片描述
这是我的配置状态,看一下CUDA版本,这个版本在安装pytorch的时候,一定要注意版本之间的兼容性。

②下一步,就是安装正确版本的pytorch和cudatoolkit。这里给大家推荐一个网站:https://pytorch.org/get-started/locally/
在这里选择自己需要安装的版本,就可以生成对应的pytorch安装命令了,比如我的:
在这里插入图片描述
就是使用pip命令,安装python版本的CUDA11.1版本兼容的pytorch。

③再下一步,输入如下两个命令,确认是否正确安装,正确的安装应出现下方的结果:
在这里插入图片描述
④安装pyG
直接运行以下代码即可,如果不行的话,可以尝试一下科学上网。

pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-geometric

其他版本的安装方法以及安装过程中出现的大部分问题的解决方案可以在:https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html 找到

4. data类-pyG中图的表示和应用

data类官方文档:https://pytorch-geometric.readthedocs.io/en/latest/modules/data.html#torch_geometric.data.Data
Data类的构造函数

class Data(object):

    def __init__(self, x=None, edge_index=None, edge_attr=None, y=None, **kwargs):

    self.x = x
    self.edge_index = edge_index
    self.edge_attr = edge_attr
    self.y = y

    for key, item in kwargs.items():
        if key == 'num_nodes':
            self.__num_nodes__ = item
        else:
            self[key] = item

在这里插入图片描述
转dict对象为Data对象
可以将dict对象转化为Data对象

graph_dict = {
    'x': x,
    'edge_index': edge_index,
    'edge_attr': edge_attr,
    'y': y,
    'num_nodes': num_nodes,
    'other_attr': other_attr
}
graph_data = Data.from_dict(graph_dict)

可以发现,graph_dict中属性值的类型与大小的要求与Data类的构造函数的要求相同。

Data对象转换成其他类型数据

1.data转化为dict:

def to_dict(self):
    return {key: item for key, item in self}

2.data转换为namedtuple:

def to_namedtuple(self):
    keys = self.keys
    DataTuple = collections.namedtuple('DataTuple', keys)
    return DataTuple(*[self[key] for key in keys])

3.data对象的一些性质:

graph_data.keys() #获取data对象包含的属性关键
graph_data.coalesce() #对边排序并移除重复边

from torch_geometric.datasets import KarateClub

dataset = KarateClub()
data = dataset[0]  # Get the first graph object.

# 获取图的一些信息
data.num_nodes # 节点数量
data.num_edges # 边数量
data.num_node_features # 节点属性的维度
data.num_features # 节点属性的维度
data.num_edge_features # 边属性的维度

data.contains_isolated_nodes() # 此图是否包含孤立的节点
data.contains_self_loops()  # 此图是否包含自环的边
data.is_undirected()  # 此图是否是无向图

在pyG中还内置了数据集Planetoid,但是下载Planetoid数据集下载失败,无法测试。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值