制作asp手机网站,东莞seo优化指南,wordpress三合一主题,广州网站建设懂你所需深度学习#xff08;36#xff09;—— 图神经网络GNN#xff08;1#xff09; 
这个系列的所有代码我都会放在git上#xff0c;欢迎造访  文章目录 深度学习#xff08;36#xff09;—— 图神经网络GNN#xff08;1#xff09;1. 基础知识2.使用场景3. 图卷积神经网…深度学习36—— 图神经网络GNN1 
这个系列的所有代码我都会放在git上欢迎造访  文章目录 深度学习36—— 图神经网络GNN11. 基础知识2.使用场景3. 图卷积神经网络GCN1基本思想 4. GNN基本框架——pytorch_geometric1数据2可视化3网络定义4训练模型semi-supervised   1. 基础知识 GNN考虑的事当前的点和周围点之间的关系  邻接矩阵是对称的稀疏矩阵表示图中各个点之间的关系  图神经网络的输入是每个节点的特征和邻接矩阵  文本数据可以用图的形式表示吗文本数据也可以表示图的形式邻接矩阵表示连接关系  邻接矩阵中并不是一个N* N的矩阵而是一个sourcetarget的2* N的矩阵   信息传递神经网络每个点的特征如何更新——考虑他们的邻居更新的方式可以自己设置最大最小平均求和等  GNN可以有多层图的结构不发生改变即当前点所连接的点不发生改变邻接矩阵不发生变化【卷积中存在感受野的概念在GNN中同样存在GNN的感受野也随着层数的增大变大】  GNN输出的特征可以干什么 各个节点的特征组合对图分类【graph级别任务】对各个节点分类【node级别任务】对边分类【edge级别任务】利用图结构得到特征最终做什么自定义  
2.使用场景 
为什么CV和NLP中不用GNN? 因为图像和文本的数据格式很固定传统神经网络格式是固定的输入的东西格式是固定的化学、医疗分子、原子结构药物靶点道路交通动态流量预测社交网络——研究人 GNN输入格式比较随意,是不规则的数据结构 主要用于输入数据不规则的时候 
3. 图卷积神经网络GCN 
图卷积和卷积完全不同GCN不是单纯的有监督学习多数是半监督有的点是没有标签的在计算损失的时候只考虑有标签的点。针对数据量少的情况也可以训练 
1基本思想 
网络层次第一层对于每个点都要做更新最后输出每个点对应的特征向量【一般不会做特别深层的】图中的基本组成G原图A邻接D度F特征度矩阵的倒数* 邻接矩阵 *度矩阵的倒数——得到新的邻接矩阵【左乘对行做归一化右乘对列做归一化】两到三层即可太多效果不佳 
4. GNN基本框架——pytorch_geometric 
它实现了各种GNN的方法 注意安装过程中不要pip install会失败根据自己的device和python版本去下载scatterpattern等四个依赖先安装他们然后再pip install torch_geometric2.0 这里记得是2.0版本否则会出现 TypeError: Expected ‘Iterator‘ as the return annotation for __iter__ of SMILESParser, but found ty 献上github地址这里 
下面是一个demo 
1数据 
这里使用的是和这个package提供的数据具体参考club  
from torch_geometric.datasets import KarateClubdataset  KarateClub()
print(fDataset: {dataset}:)
print()
print(fNumber of graphs: {len(dataset)})
print(fNumber of features: {dataset.num_features})
print(fNumber of classes: {dataset.num_classes})data  dataset[0]  # Get the first graph object.在torch_geometric中图用Data的格式Data的对象可以在文档中详细了解 其中的属性 
edge_index表示图的连接关系start,end两个序列node features每个点的特征node labels每个点的标签train_mask有的节点没有标签用来表示哪些节点要计算损失 
2可视化 
from torch_geometric.utils import to_networkxG  to_networkx(data, to_undirectedTrue)
visualize_graph(G, colordata.y)3网络定义 
GCN layer的定义 可以在官网的文档做详细了解 卷积层就有很多了  
import torch
from torch.nn import Linear
from torch_geometric.nn import GCNConvclass GCN(torch.nn.Module):def __init__(self):super().__init__()torch.manual_seed(1234)self.conv1  GCNConv(dataset.num_features, 4) # 只需定义好输入特征和输出特征即可self.conv2  GCNConv(4, 4)self.conv3  GCNConv(4, 2)self.classifier  Linear(2, dataset.num_classes)def forward(self, x, edge_index):h  self.conv1(x, edge_index) # 输入特征与邻接矩阵注意格式上面那种h  h.tanh()h  self.conv2(h, edge_index)h  h.tanh()h  self.conv3(h, edge_index)h  h.tanh()  # 分类层out  self.classifier(h)return out, hmodel  GCN()
print(model)_, h  model(data.x, data.edge_index)
print(fEmbedding shape: {list(h.shape)})# 输出最后分类前的中间特征shapevisualize_embedding(h, colordata.y)这时很分散  
4训练模型semi-supervised 
import timemodel  GCN()
criterion  torch.nn.CrossEntropyLoss()  # Define loss criterion.
optimizer  torch.optim.Adam(model.parameters(), lr0.01)  # Define optimizer.def train(data):optimizer.zero_grad()  out, h  model(data.x, data.edge_index) #h是两维向量主要是为了画图方便 loss  criterion(out[data.train_mask], data.y[data.train_mask])  # semi-supervisedloss.backward()  optimizer.step()  return loss, hfor epoch in range(401):loss, h  train(data)if epoch % 10  0:visualize_embedding(h, colordata.y, epochepoch, lossloss)time.sleep(0.3)然后就可以看到一系列图看点的变化情况了