有关图的模型纵览
从数据只能的存储模型(信息的抽取与存储)向图,动态模型的转变。可能模型中有隐形的结构,但感觉隐性的结构没有显性的快与易于引导与控制。
{
P
r
o
p
a
g
a
t
i
o
n
M
o
d
u
l
e
.
传
播
模
块
用
于
在
节
点
之
间
传
播
信
息
,
以
便
聚
合
的
信
息
能
够
捕
获
特
征
信
息
和
拓
扑
信
息
。
S
a
m
p
l
i
n
g
M
o
d
u
l
e
.
采
样
模
块
通
常
需
要
在
图
上
进
行
传
播
。
采
样
模
块
通
常
与
传
播
模
块
相
结
合
。
P
o
o
l
i
n
g
M
o
d
u
l
e
.
当
我
们
需
要
高
级
子
图
或
图
的
表
示
时
,
需
要
池
化
模
块
来
从
节
点
提
取
信
息
。
\left\{\begin{array}{l} Propagation \ Module. {\tiny传播模块用于在节点之间传播信息,以便聚合的信息能够捕获特征信息和拓扑信息。}\\ Sampling Module. {\tiny采样模块通常需要在图上进行传播。采样模块通常与传播模块相结合。}\\ Pooling Module. {\tiny当我们需要高级子图或图的表示时,需要池化模块来从节点提取信息。} \end{array}\right.
⎩⎨⎧Propagation Module.传播模块用于在节点之间传播信息,以便聚合的信息能够捕获特征信息和拓扑信息。SamplingModule.采样模块通常需要在图上进行传播。采样模块通常与传播模块相结合。PoolingModule.当我们需要高级子图或图的表示时,需要池化模块来从节点提取信息。
P
r
o
p
a
g
a
t
i
o
n
M
o
d
u
l
e
{
c
o
n
v
o
l
u
t
i
o
n
o
p
e
r
a
t
o
r
r
e
c
u
r
r
e
n
t
o
p
e
r
a
t
o
r
卷
积
算
子
和
递
归
算
子
通
常
用
于
聚
合
来
自
邻
居
的
信
息
,
而
跳
过
连
接
操
作
用
于
从
节
点
的
历
史
表
示
中
收
集
信
息
,
并
缓
解
过
度
平
滑
(
o
v
e
r
−
s
m
o
o
t
h
i
n
g
)
问
题
。
Propagation \ Module \left\{\begin{array}{l} convolution operator\\ recurrent operator \end{array}\right. \tiny 卷积算子和递归算子通常用于聚合来自邻居的信息,而跳过连接操作用于从节点的历史表示中收集信息,并缓解过度平滑(over-smoothing)问题。
Propagation Module{convolutionoperatorrecurrentoperator卷积算子和递归算子通常用于聚合来自邻居的信息,而跳过连接操作用于从节点的历史表示中收集信息,并缓解过度平滑(over−smoothing)问题。
GNN网络将图映射到输出通过以下两个步骤。
- 首先,通过传播(propagation step)的出每个节点的表示。
- 然后使用输出模型
o
v
=
g
(
h
v
,
l
v
)
o_v = g(h_v, l_v)
ov=g(hv,lv) 把每个节点的表示和标签映射为一个输出。
为 了 使 用 一 般 方 法 处 理 图 整 体 的 分 类 , 也 有 模 型 建 议 构 造 一 个 通 过 特 殊 边 与 所 有 节 点 相 连 接 的 " s u p e r n o d e " \tiny \color{red}为了使用一般方法处理图整体的分类,也有模型建议构造一个通过特殊边与所有节点相连接的"super \ node" 为了使用一般方法处理图整体的分类,也有模型建议构造一个通过特殊边与所有节点相连接的"super node"
以下为一般GNN 模型的架构。
模型纵览的论文,结尾有实现代码链接
图卷积神经网络
RESIDUAL GATED GRAPH CONVNETS
GRAPH CONVOLUTIONAL NETWORKS
图神经网络
Transformers是一种图神经网络
可以通过dgl库实现,以下为github中得到的代码:
-*- coding: utf-8 -*-
"""
==================================================
File Name: gcn.py
email: songdongdong@weidian.com
Author : songdongdong
date: 2021/3/8 15:44
Description :
gcn图卷积网络,全称:graph convolutional networks 图卷积网络,提出于2017年,GCN的出现标志这图神经网络的出现,要说深度学习最常用的网络结构就是
CNN,RNN。GCN与CNN不仅名字相似,其实理解起来也很类似,都是特征提取器。不同的是,CNN提取的张量数据特征,而GCN提出的是图数据特征
==================================================
"""
import torch
import torch.nn as nn
import torch.nn.functional as F
from dgl.nn.pytorch import GraphConv # 这是一个图 DGL库
from dgl.data import CoraGraphDataset
class GCN(nn.Module):
def __init__(self, g, in_feats,
n_hidden,
n_classes,
n_layers,
activation,
dropout):
super(GCN, self).__init__()
self.g = g
self.layers = nn.ModuleList()
# 输入层
self.layers.append(GraphConv(in_feats, n_hidden, activation=activation))
#
for i in range(n_layers - 1):
self.layers.append(GraphConv(n_hidden, n_hidden, activation=activation))
# 输出层:
self.layers.append(GraphConv(n_hidden, n_classes))
self.dropout = nn.Dropout(p=dropout)
def forward(self, features):
h = features
for i, layer in enumerate(self.layers):
if i!=0:
h = self.dropout(h)
h = layer(self.g,h)
return h
# @torch.no_grad()
def evalutate(model,features,labels,mask):
model.eval()
with torch.no_grad():
logits = model(features)
# print(logits)
logits = logits[mask]
labels = labels[mask]
_,indices = torch.max(logits,dim=1)
correct = torch.sum(indices == labels)
return correct.item() * 1.0 / len(labels)
def train( n_epochs=100,lr=1e-2,
weight_decay=5e-4,n_hidden=16,
n_layers=1,activation=F.relu,
dropout=0.5):
data = CoraGraphDataset()
print(data)
g = data[0]
features = g.ndata['feat']
labels = g.ndata['label']
train_mask = g.ndata['train_mask'] #是true,fasle。其实就是样本提取
val_mask = g.ndata['val_mask']
test_mask = g.ndata['test_mask']
in_feats = features.shape[1]
n_classes = data.num_classes
model = GCN(g,in_feats,n_hidden,n_classes,n_layers,activation,dropout)
loss_fcn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(),lr=lr,weight_decay=weight_decay)
for epoch in range(n_epochs):
model.train()
logits =model(features)
loss = loss_fcn(logits[train_mask],labels[train_mask])
optimizer.zero_grad()
loss.backward()
optimizer.step()
acc =evalutate(model,features,labels,val_mask)
print("Epoch {} | Locc {:.4f} | accuracy {:.4f}".format(epoch,loss.item(),acc))
print()
acc =evalutate(model,features,labels,test_mask)
print("Test accuracy {:.2%}".format(acc))
if __name__ == "__main__":
train()