图注意力网络

【图书推荐】《图神经网络基础、模型与应用实战》_搭建神经网络需要看什么书-CSDN博客

图注意力网络的由来和发展

图注意力网络(GAT)是一种图神经网络(GNN)模型,最早由Petar Velickovic等在2017年提出。它的设计灵感来自自然语言处理领域中的注意力机制,旨在处理图数据时引入注意力机制,以便更好地捕捉节点之间的关系和信息。

注意力机制最初用于自然语言处理中的机器翻译任务,是由Bahdanau等在2014年提出的。这一机制允许模型在生成目标语言的每个单词时,根据源语言句子中的不同部分动态地分配注意力权重。图卷积神经网络借鉴了这个思想,将其应用于图数据中的节点和邻居节点。

图卷积神经网络的关键思想是:为每个节点动态计算邻居节点的注意力权重,并使用这些权重对邻居节点的特征进行加权求和,从而生成节点的表示。这允许节点有选择性地关注与其相关性较高的邻居节点,使模型能够更好地学习节点之间的关系。

图注意力网络模型代码实现

以下是一个简单的Python代码示例,演示了如何使用PyTorch实现一个基本的图注意力网络模型。请注意,在实际应用中,你可能需要使用更复杂的图注意力网络变体,例如多头图注意力网络,以获得更好的性能。

我们新引入了一个torch_geometric库,这是一个用于图神经网络的PyTorch扩展库,专门用于处理和分析图数据。它提供了许多功能和工具,使得在图结构数据上进行深度学习任务更加方便和高效。

使用这个库需要提前安装,安装命令如下:

pip install torch_geometric

图注意力网络模型代码如下:

import torch
import torch.nn as nn
import torch. optim as optim
import torch. nn. functional as F
from torch_geometric.datasets import KarateClub 
from torch_geometric. data import DataLoader
from torch_geometric. nn import GATConv

#创建一个图注意力网络的类
class GATNetwork(nn. Module):
    def __init__(self, num_features, num_classes, num_heads): 
        super(GATNetwork, self).__init__()
        self.conv1= GATConv(num_features, 8, heads=num_heads) 
        self.conv2 = GATConv(8 * num_heads, num_classes, dropout=0.6)
    def forward(self, data):
        x, edge_index=data.x, data. edge_index
        x= F.relu(self.conv1(x, edge_index))
        x = F. dropout(x, training-self. training)
        x = self. conv2(x, edge_index)
        return F. log_softmax(x, dim=1)
#创建训练函数
def train(model, train_loader, optimizer, device):
    model. train()
    loss_all= 0
    for data in train_loader:
        data = data. to(device)
        optimizer. zero_grad()
        output=model(data)
        loss = F. nll_loss(output, data.y)
        loss. backward()
        loss_all += loss.item()
        optimizer. step()
    return loss_all/ len(train_loader)
#创建测试函数
def test(model, test_loader, device):
    model. eval()
    correct=0
    for data in test_loader:
        data=data. to(device)
        output = model(data)
        pred=output. max(dim=1) [1]
        correct += pred. eq(data. y). sum().item() 
    return correct/len(test_loader.dataset)

这段代码实现了一个基于图神经网络的图分类模型,并提供了训练和测试函数,可以用于学习和评估图数据集上的分类任务。这种类型的模型在图数据分析和节点分类等领域应用广泛。

#超参数设置
num_epochs = 200
lr = 0.005
num_heads = 8
#加载数据集
dataset = KarateClub()
data = dataset [0]
#创建数据加载器
loader = DataLoader(dataset, batch_size=1, shuffle=True)

#初始化模型和优化器
model = GATNetwork(dataset. num_features, dataset. num_classes, num_heads) 
device = torch. device('cuda' if torch. cuda. is_available() else 'cpu') 
model = model. to(device)
optimizer=optim. Adam(model. parameters(), lr=lr)

#训练和测试模型
for epoch in range(1, num_epochs + 1):
    loss = train(model, loader, optimizer, device)
    acc=test(model, loader, device)
    if epoch%20== 0:
        print(f' Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f}')

print("Training finished. ")

上述代码主要用于初始化模型、设置优化器、设置超参数和进行多轮训练。

代码运行结果如下:

 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
 Epoch: epoch), Loss: loss:.4f), Accuracy: [acc:.4f]
Training finished. 

《图神经网络基础、模型与应用实战(人工智能技术丛书)》(兰伟,叶进,朱晓姝)【摘要 书评 试读】- 京东图书 (jd.com)

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值