请帮我写出基于pytorch geometric GCN实现图分类的代码,每个图有一个标签0或1。
时间: 2024-05-13 19:16:20 浏览: 81
利用pytorch实现图像分类的一个完整的代码
好的,以下是基于 PyTorch Geometric 的 GCN 实现图分类的代码示例:
```python
import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
# 加载Cora数据集
dataset = Planetoid(root='./data', name='Cora')
# 构建图卷积神经网络模型
class GCN(torch.nn.Module):
def __init__(self):
super(GCN, self).__init__()
self.conv1 = GCNConv(dataset.num_node_features, 16)
self.conv2 = GCNConv(16, dataset.num_classes)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
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 = GCN().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
# 训练模型
model.train()
for epoch in range(200):
optimizer.zero_grad()
out = model(dataset[0].x.to(device), dataset[0].edge_index.to(device))
loss = F.nll_loss(out, dataset[0].y.to(device))
loss.backward()
optimizer.step()
# 测试模型
model.eval()
_, pred = model(dataset[0].x.to(device), dataset[0].edge_index.to(device)).max(dim=1)
correct = int(pred.eq(dataset[0].y.to(device)).sum().item())
acc = correct / len(dataset[0].y)
print('Accuracy: {:.4f}'.format(acc))
```
其中,`Planetoid` 是 PyTorch Geometric 中自带的数据集之一,可以直接加载 Cora 数据集。`GCNConv` 是 PyTorch Geometric 中的图卷积层。在模型的 forward 函数中,我们首先将输入特征 `x` 和邻接矩阵 `edge_index` 通过第一层 GCN 进行卷积,然后进行 ReLU 激活、dropout 和第二层 GCN 卷积,最终通过 `log_softmax` 函数得到每个类别的概率分布。
在训练过程中,我们使用负对数似然损失函数 `nll_loss`。在测试过程中,我们将模型设为评估模式,使用 `max` 函数获取每个样本的预测类别并计算准确率。
阅读全文