飞桨图神经网络7日打卡训练营--GCN+GAT

飞桨图神经网络7日打卡训练营--GCN+GAT

最近在参加飞桨图神经网络7日打卡训练营,这是第三次课的内容。下面记录以下自己的学习心得。这些知识比较契合我的研究方向,这个训练营资源很多,对自己很有帮助,祝自己顺利!祝大家身体健康,开开心心!

一、GCN

GCN是经典一个经典的图卷积网络模型。
推广形式的GCN公式:
H ( l + 1 ) = σ ( D ^ − 1 2 A ^ D ^ − 1 2 H ( l ) W ( l ) ) H^{(l+1)}=\sigma(\hat {D}^{-\frac{1}{2}}\hat{A}\hat {D}^{-\frac{1}{2}}H^{(l)}W^{(l)}) H(l+1)=σ(D^21A^D^21H(l)W(l))
σ \sigma σ是激活函数, A ^ \hat{A} A^是加了加了自环的邻接矩阵, A ^ = A + I N \hat{A}=A+I_{N} A^=A+IN, D ^ \hat{D} D^ A ^ \hat{A} A^对应的邻接矩阵。

二、GAT

利用注意力机制把注意力分配到目标节点的邻居节点集上。下图左边为目标节点特征的线性变换,右边为目标节点特征的线性变换,通过 e i j = a ( W h → i , W h → j ) e_{ij}=a(W\overrightarrow{h}_{i},W\overrightarrow{h}_{j}) eij=a(Wh i,Wh j)计算注意力系数,然后用softmax函数归一化:
α i j = s o f t m a x j ( e i j ) = e x p ( e i j ) ∑ k ∈ N i e x p ( e i k ) \alpha_{ij}=softmax_{j}(e_{ij})=\frac{exp(e_{ij})}{\sum_{k\in N_{i}}exp(e_{ik})} αij=softmaxj(eij)=kNiexp(eik)exp(eij)
在这里插入图片描述
从每一头聚合特征,得到 h → i ′ \overrightarrow{h}_{i}^{'} h i
在这里插入图片描述

代码实现

利用pgl实现GAT算法
下面我用pytorch来实现一下

// pytorh 实现GAT
import numpy as np
from torch_geometric.nn import GATConv
import torch_geometric.nn as tnn
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root = './tmp/Cora',name = 'Cora')
learning_rate = 0.01
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.gat1 = GATConv(dataset.num_features,64,dropout = 0.2)
        self.gat2 = GATConv(64,dataset.num_classes,dropout = 0.2)
        self.dropout = nn.Dropout(p = 0.2)
    def forward(self,input):
        x,edge_index = input.x , input.edge_index
        x = self.dropout(x)
        x = self.gat1(x,edge_index)
        x = self.dropout(x)
        x = self.gat2(x,edge_index)
        out = F.softmax(x,dim = 1)
        return out

model = Net()
optimizer = optim.Adam(model.parameters(),lr = learning_rate,weight_decay = 5e-4)
epochs = 1000
data = dataset[0]
model.train()
for i in range(epochs):
    optimizer.zero_grad()
    logits = model(data)
    loss = F.nll_loss(logits[data.train_mask],data.y[data.train_mask])
    _,logit = logits.max(dim = 1)
    score = float(logit[data.train_mask].eq(data.y[data.train_mask]).sum().item())
    print('epoch:{},train Acc:{:.4f},loss:{:.4f}'.format(i,score/data.train_mask.sum().item(),loss.item()))
    loss.backward()
    optimizer.step()

model.eval()
_,pred=model(data).max(dim=1)
correct=float(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item())
acc=correct/data.test_mask.sum().item()
print('Accuracy:{:.4f}'.format(acc))

torch_geometric已经把gat封装成了GATConv类,不用自己过多编写什么。同样的pgl里面也封装了很多经典的算法模型,如gcn,gat,gin等,确实强大,可以帮助自己快速复现一些算法,里面有很多优化,速度也快,以后要多加琢磨这个库。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GCN+Transformer和GAT+Transformer是两种常见的神经网络模型,它们在数据上进行特征提取和表示学习。下面是它们的对比以及各自的优劣势: 1. GCN+Transformer: - GCN(Graph Convolutional Network)是一种基于邻居节点信息传递的卷积模型,通过聚合邻居节点的特征来更新节点的表示。 - Transformer是一种基于自注意力机制的序列建模模型,广泛应用于自然语言处理任务中。 - GCN+Transformer将GCN和Transformer结合,使用GCN进行结构建模,然后使用Transformer进行特征融合和表示学习。 2. GAT+Transformer: - GAT(Graph Attention Network)是一种基于注意力机制的神经网络模型,通过学习节点之间的注意力权重来进行特征聚合。 - Transformer同样是一种基于自注意力机制的序列建模模型。 - GAT+Transformer将GAT和Transformer结合,使用GAT进行结构建模,然后使用Transformer进行特征融合和表示学习。 对比: - GCN+Transformer和GAT+Transformer都是将神经网络和Transformer结合起来,用于数据的特征提取和表示学习。 - GCN+Transformer使用GCN进行邻居节点信息传递,适用于较小规模的数据,对于密集连接的效果较好。 - GAT+Transformer使用注意力机制进行节点特征聚合,适用于大规模数据,能够处理稀疏连接的。 - GCN+Transformer相对简单且易于实现,而GAT+Transformer在计算效率上可能会有一定的挑战。 - 在具体任务中,选择哪种模型取决于数据的特点、规模以及任务要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值