python实现gnn算法附代码
时间: 2025-01-12 22:52:42 浏览: 96
### Python 实现图神经网络 (GNN) 算法
#### 使用 PyTorch Geometric 库构建简单 GNN 模型
为了简化开发过程并提高效率,通常会选择使用专门设计用于处理图形数据的库之一——PyTorch Geometric。下面是一个基于此库创建基础版本 Graph Convolutional Network (GCN)[^1]的例子。
```python
import torch
from torch.nn import Linear, ReLU, Sequential
from torch_geometric.datasets import Planetoid
from torch_geometric.loader import DataLoader
from torch_geometric.nn.conv import GCNConv
from torch_geometric.transforms import NormalizeFeatures
class SimpleGCN(torch.nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(SimpleGCN, self).__init__()
# 定义两层GCN卷积操作
self.gcn1 = GCNConv(input_dim, hidden_dim)
self.act_fn = ReLU()
self.fc = Linear(hidden_dim, output_dim)
def forward(self, data):
x, edge_index = data.x, data.edge_index
# 前向传播计算
h = self.act_fn(self.gcn1(x, edge_index))
out = self.fc(h)
return out
if __name__ == "__main__":
dataset_name = 'Cora'
path = './data/' + dataset_name
transform = NormalizeFeatures() # 数据预处理
dataset = Planetoid(root=path,
name=dataset_name,
transform=transform)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = SimpleGCN(dataset.num_features, 16, dataset.num_classes).to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
loader = DataLoader(dataset, batch_size=len(dataset), shuffle=True)
for epoch in range(200): # 训练周期数
total_loss = 0
for batch in loader:
batch.to(device)
optimizer.zero_grad()
pred = model(batch)
loss = torch.nn.functional.nll_loss(pred.log_softmax(dim=-1),
batch.y.squeeze())
loss.backward()
optimizer.step()
total_loss += float(loss.item()) * batch.num_graphs
avg_loss = total_loss / len(loader.dataset)
print(f'Epoch {epoch}, Loss: {avg_loss:.4f}')
```
这段代码展示了如何利用 `torch_geometric` 创建一个简单的二层 GCN 来解决半监督节点分类问题。这里选择了 Cora 文献引用网络作为训练集,并实现了标准化特征变换以及 Adam 优化器来进行参数更新。
阅读全文
相关推荐


















