图神经网络(GNN)
1. 图的基本概念
通常使用G = (V, E)来表示图,其中V表示节点的集合、E表示边的集合。对于两个相邻节点u , v 使用e=(u,v)表示这两个节点之间的边。两个节点之间边既可能是有向,也可能无向。若有向,则称之有向图(Directed Graph), 反之,称之为无向图(Undirected Graph)。
2. 图的表示
在图神经网络中,常见的表示方法有邻接矩阵、度矩阵、拉普拉斯矩阵等。


3. 经典的图神经网络模型
-
GCN: Graph Convolution Networks(图卷积网络)
GCN是一种在图中结合拓扑结构和顶点属性信息学习顶点的embedding表示的方法。然而GCN要求在一个确定的图中去学习顶点的embedding,无法直接泛化到在训练过程没有出现过的顶点,即属于一种直推式(transductive)的学习。
-
GraphSAGE:Graph Sample and aggregate (图采样和聚合)
GraphSAGE则是一种能够利用顶点的属性信息高效产生未知顶点embedding的一种归纳式(inductive)学习的框架。其核心思想是通过学习一个对邻居顶点进行聚合表示的函数来产生目标顶点的embedding向量。
-
GAT:Graph Attention Networks(图注意力网络)
为了解决GNN聚合邻居节点的时候没有考虑到不同的邻居节点重要性不同的问题,GAT借鉴了
Transformer的idea,引入masked self-attention机制,在计算图中的每个节点的表示的时候,会根据邻居节点特征的不同来为其分配不同的权值。
4.GCN: Graph Convolution Networks(图卷积网络)
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch_geometric.data import Data
from torch_geometric.nn import GCNConv
# 1. 创建数据并标准化
# 节点特征 (4个节点,每个节点3维特征)
x = torch.tensor([
[1.0, 0.2, 0.5], # 节点0
[0.4, 0.9, 0.1], # 节点1
[0.8, 0.3, 0.6], # 节点2
[0.1, 0.7, 0.4] # 节点3
], dtype=torch.float)
edge_index = torch.tensor([
[0, 1, 1, 2, 2, 3], # 源节点
[1, 0, 2, 1, 3, 2] # 目标节点
], dtype=torch.long)
y = torch.tensor([12.5, 18.3, 22.1, 15.4], dtype=torch.float).view(-1, 1)
# 数据标准化
x_mean, x_std = x.mean(dim=0), x.std(dim=0)
y_mean, y_std = y.mean(), y.std()
data = Data(
x=(x - x_mean) / x_std,
edge_index=edge_index,
y=(y - y_mean) / y_std,
train_mask=torch.tensor([True, True, False, False]), # 前两个节点训练
test_mask=torch.tensor([False, False, True, True]) # 后两个节点测试
)
# 2. 增强模型
class EnhancedGCNRegressor(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = GCNConv(3, 32)
self.conv2 = GCNConv(32, 16)
self.conv3 = GCNConv(16, 8)
self.linear = nn.Linear(8, 1)
self.dropout = 0.2
def forward(self, x, edge_index):
x = F.relu(self.conv1(x, edge_index))
x = F.dropout(x, self.dropout

最低0.47元/天 解锁文章
1064

被折叠的 条评论
为什么被折叠?



