pytorch gcn
时间: 2025-04-24 21:09:52 浏览: 20
### 使用PyTorch实现图卷积网络(GCN)
#### 安装依赖库
为了使用PyTorch实现GCN,需要安装必要的软件包。可以通过pip命令来完成这些操作:
```bash
pip install torch torchvision torchaudio dgl-cu113 # 如果使用GPU支持CUDA版本
pip install torch torchvision torchaudio dgl # CPU版本
```
#### 导入所需模块
在编写代码之前,先导入所需的Python库和工具。
```python
import os
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.transforms import NormalizeFeatures
from torch_geometric.nn import GCNConv, GATv2Conv
```
#### 数据集准备
这里以Cora数据集为例说明如何加载并预处理数据。该数据集是一个经典的引文网络数据集,在节点分类任务上被广泛采用。
```python
dataset = Planetoid(root='/tmp/Cora', name='Cora', transform=NormalizeFeatures())
data = dataset[0] # 获取单个图形对象
print(f'Dataset: {dataset}:')
print('======================')
print(f'Number of graphs: {len(dataset)}')
print(f'Number of features: {dataset.num_features}')
print(f'Number of classes: {dataset.num_classes}')
print(data)
print('==========================================================================================================')
# Gather some statistics about the graph.
print(f'Number of nodes: {data.num_nodes}') # 节点数量
print(f'Number of edges: {data.num_edges}') # 边的数量
print(f'Average node degree: {data.num_edges / data.num_nodes:.2f}') # 平均度数
print(f'Training labels rate: {(int(data.train_mask.sum()) / data.num_nodes):.2f}') # 训练标签比例
print(f'Testing labels rate: {(int(data.test_mask.sum()) / data.num_nodes):.2f}') # 测试标签比例
print(f'Is undirected: {data.is_undirected()}') # 是否无向图
```
#### 构建GCN模型结构
定义一个简单的两层GCN架构来进行节点分类实验。
```python
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = GCNConv(dataset.num_node_features, 16) # 输入特征维度 -> 隐藏层单元数
self.conv2 = GCNConv(16, dataset.num_classes) # 隐藏层单元数 -> 输出类别数目
def forward(self, x, edge_index):
x = F.relu(self.conv1(x, edge_index)) # 应用ReLU激活函数
x = F.dropout(x, training=self.training) # Dropout防止过拟合
x = self.conv2(x, edge_index) # 第二层传播规则
return F.log_softmax(x, dim=1)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device)
data = data.to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
```
#### 模型训练过程
设置好超参数之后就可以开始迭代更新权重矩阵W了。
```python
def train():
model.train()
optimizer.zero_grad()
out = model(data.x, data.edge_index)
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
for epoch in range(1, 201):
train()
if epoch % 10 == 0:
print(f'(EPOCH:{epoch}) Training Loss:', end=" ")
_, pred = model(data.x, data.edge_index).max(dim=1)
correct = float(pred[data.train_mask].eq(data.y[data.train_mask]).sum().item())
acc = correct / int(data.train_mask.sum())
print(loss.item(), f'\tAccuracy: {acc:.4f}')
```
#### 模型测试效果评估
最后一步是对验证集或者测试集合上的表现情况进行评测。
```python
def test(mask):
model.eval()
logits, accs = model(data.x, data.edge_index), []
for mask_name, msk in {'train': data.train_mask, 'val': data.val_mask, 'test': data.test_mask}.items():
pred = logits[msk].max(1)[1]
acc = pred.eq(data.y[msk]).sum().item() / msk.sum().item()
accs.append(acc)
print(f'{mask_name} set accuracy: {acc:.4f}', end='\n\n')
test('test')
```
上述代码展示了基于`torch_geometric`库的一个简单而完整的GCN实现流程[^2][^4]。
阅读全文
相关推荐


















