【图书推荐】《图神经网络基础、模型与应用实战》_搭建神经网络需要看什么书-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)