使用 GNN 进行节点分类
Cora 数据集、两层 GCN、训练循环、掩码损失、测试准确率和嵌入可视化。
使用 GNN 进行节点分类 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
节点分类任务
节点分类利用节点特征和图结构来预测每个节点的标签。一个经典例子是:在引用网络中,根据论文内容以及论文引用了哪些其他论文,为每篇论文标注其研究主题。
Cora 数据集
Cora 是图学习领域的 MNIST。它是一个包含 2,708 篇机器学习论文的引用图。边表示引用关系;每篇论文都有一个长度为 1433 的词袋特征向量;目标是将每篇论文分类到 7 个主题中的一个。
# Cora:
# nodes = 2708 papers
# edges = citations
# features per node = 1433
# classes = 7通过 Planetoid 加载
PyTorch Geometric 通过 Planetoid 加载器提供 Cora,它会下载数据并将其格式化为一个图对象。
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root="data/Cora", name="Cora")
data = dataset[0]
print(data) # x, edge_index, y, train_mask, test_mask数据对象
图对象包含所有内容:data.x(特征,2708 x 1433)、data.edge_index(连接关系)、data.y(真实标签),以及用于标记哪些节点分别用于训练、验证和测试的布尔掩码。
包含 7 个类别的 GCN
我们构建一个两层 GCN,将 1433 个输入特征先映射到包含 64 个维度的隐藏层,再映射为 7 个类别的未归一化得分。
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class GCN(torch.nn.Module):
def __init__(self):
super().__init__()
self.conv1 = GCNConv(1433, 64)
self.conv2 = GCNConv(64, 7)
def forward(self, x, edge_index):
x = F.relu(self.conv1(x, edge_index))
x = F.dropout(x, training=self.training)
return self.conv2(x, edge_index)传导式学习
Cora 属于传导式场景:整个图(包括测试节点及其特征)在训练期间都是可见的;我们只隐藏测试节点的标签。模型利用所有节点的连接关系,但只从带标签的训练节点中学习。
训练掩码
训练掩码是一个布尔向量,用于选择哪些节点参与损失计算。我们在整个图上运行模型,但只在掩码选中的训练节点上计算交叉熵。
model = GCN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
def train():
model.train()
optimizer.zero_grad()
out = model(data.x, data.edge_index)
loss = F.cross_entropy(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
return loss.item()掩码损失直觉
虽然前向传播会为全部 2708 个节点生成未归一化得分,但使用 train_mask 进行索引后,损失就只限于带标签的训练节点。未标记节点仍会传递消息,从而帮助模型学习,但不会直接推动梯度更新。
使用测试掩码进行评估
训练完成后,我们在保留的测试掩码节点上评估准确率,损失计算从未使用过这些节点。这可以衡量模型对其标签从未见过的论文的泛化能力。
@torch.no_grad()
def test():
model.eval()
pred = model(data.x, data.edge_index).argmax(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
return int(correct) / int(data.test_mask.sum())使用 t-SNE 可视化嵌入表示
要查看 GCN 学到了什么,可以取出隐藏层的节点嵌入表示,并使用t-SNE将其投影到二维空间。训练良好的 GCN 会产生清晰的簇,使同一类别的节点聚集在一起。
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
emb = model.conv1(data.x, data.edge_index).detach().numpy()
z = TSNE(n_components=2).fit_transform(emb)
plt.scatter(z[:, 0], z[:, 1], c=data.y, cmap="tab10", s=8)解读 t-SNE 图
分离良好的彩色簇表示嵌入表示具有区分类别的能力,说明 GCN 学到了有用的结构。相互重叠的团块可能意味着训练不足或过平滑。t-SNE 是一种定性检查,而不是评价指标。
快速检查
测试您的节点分类知识。
回顾
您学习了使用 GNN 进行节点分类:
- Planetoid加载Cora引用图
- 两层 GCN 将1433 映射为 64,再映射为 7 个类别
- 训练掩码限制损失范围;测试掩码衡量泛化能力
- t-SNE可视化节点嵌入表示,以检查类别分离情况
常见问题解答
「使用 GNN 进行节点分类」课时是免费的吗?
是的 — 「使用 GNN 进行节点分类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「使用 GNN 进行节点分类」这节课中我会学到什么?
Cora 数据集、两层 GCN、训练循环、掩码损失、测试准确率和嵌入可视化。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 GNN 进行节点分类」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 机器学习的图论基础
- 图卷积网络(GCN)
- 使用 GNN 进行节点分类
- 链接预测与图分类