PyTorch第三方库 2. GNN使用PyG的实现( 五 )


中采用的将多个图封装成批的方式是:将小图作为连通组件( )的形式合并,构建一个大图 。于是小图的邻接矩阵存储在大图邻接矩阵的对角线上 。大图的邻接矩阵、属性矩阵、预测目标矩阵分别为:
注意,邻接矩阵没有额外的内存开销,因为它们是以稀疏的方式保存的,只保留非零项,即边 。
数据集(包含600个图,分为6类)为例做介绍
注:上图黄字说明——第一个graph包含有37个节点,每个节点特征维度为3,有1682=84条无向边,并且该graph的标签(类别)的维度为1 。
#加载ENZYMES数据集from torch_geometric.datasets import TUDatasetfrom torch_geometric.loader import DataLoaderdataset = TUDataset(root='/tmp/ENZYMES', name='ENZYMES', use_node_attr=True)loader = DataLoader(dataset, batch_size=4, shuffle=True)#获取一个batchbatch = loader.__iter__().next()print(batch)
batch属性说明
1. ptr属性
如上图所示batch['ptr']的结果为:([ 0, 20, 62, 81, 130])

PyTorch第三方库  2. GNN使用PyG的实现

文章插图
for i in range(batch.num_graphs): #num_graphs:4print(batch[i])#batch['ptr']:tensor([0,20,62,81, 130])'''Data(edge_index=[2, 82], x=[20, 21], y=[1])——batch[0]就是[0:20] 20-0=20Data(edge_index=[2, 176], x=[42, 21], y=[1])——batch[1]就是[20:62] 62-20=42 Data(edge_index=[2, 78], x=[19, 21], y=[1])——batch[2]就是[62:81] 81-62=19 Data(edge_index=[2, 188], x=[49, 21], y=[1])——batch[3]就是[81:130] 130-81=49 '''
2. batch属性
#加载ENZYMES数据集from torch_geometric.datasets import TUDatasetfrom torch_geometric.loader import DataLoaderdataset = TUDataset(root='/tmp/ENZYMES', name='ENZYMES', use_node_attr=True)## 每次加载4个数据到内存中,loader = DataLoader(dataset, batch_size=4, shuffle=True)loader = DataLoader(# 要加载的数据集dataset=dataset,# ENZYMES包含600个图# 每次加载4个batch_size=4,# 每次加入进来之后是否随机打乱数据(可以增加模型的泛化性)shuffle=True)batch = loader.__iter__().next()print(batch)print(batch['ptr'])print(batch.batch)print((batch.batch==0).sum())print((batch.batch==1).sum())# edge_index:连接的边#x:整个batch的节点特征矩阵#y:graph标签#batch:列向量,用于指示每个节点属于batch中的第几个graph#ptr: pointer record 第几个graph起始的指针位置'''DataBatch(edge_index=[2, 498], x=[124, 21], y=[4], batch=[124], ptr=[5])tensor([0,27,49, 108, 124])tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,3, 3, 3, 3])tensor(27) #第一个graph graph0有27个图tensor(22) #第二个graph graph1有49-27=22个图'''
为什么要获取一个batch?
【】
3. 生化任务的一些第三方包
分子和蛋白质是可以用图来表示的结构化实体 。原子或残基作为节点,化学键或链作为边 。
rdkit官方文档
RDKit— The RDKit 2022.03.1
RDKit是一个专门处理化学分子数据的包,可以用来读取分子文件,提取分子的各种特征 。(比如读取.csv文件里面的,然后将转成RDKit的)
1. 如何画分子&一些分子操作方法的引入
from rdkit import Chemfrom rdkit.Chem.Draw import IPythonConsolefrom rdkit.Chem import DrawIPythonConsole.ipython_useSVG=False #如果想展示PNG请设置为FALSE