Cora 数据集是图神经网络(GNN)领域中常用的基准数据集之一。它用于研究节点分类任务,特别是在文献引用网络中。

Cora 数据集简介

Cora 数据集由 2708 篇科学出版物组成,这些出版物被分为 7 个类别。节点代表论文,边代表引用关系。每个节点有一个 1433 维的特征向量,表示论文的词袋模型(Bag of Words),特征向量中的每个维度表示某个词汇是否出现在论文中。

数据集的具体结构:
  • 节点(Nodes):2708 个节点,每个节点表示一篇论文。
  • 边(Edges):5429 条边,每条边表示两篇论文之间的引用关系。
  • 特征向量(Features):1433 维的二进制词袋模型。
  • 标签(Labels):7 个类别,表示论文所属的领域。

简单版的代码适合魔改(乱写)给出我对代码的分析

  • 通过Planetoid()加载数据集打印len(data)=6,说明data对象通常包含以下六个属性x(节点特征矩阵):形状为 [num_nodes, num_features] 的张量,edge_index(边的索引矩阵):形状为 [2, num_edges] 的张量,y(节点标签):形状为 [num_nodes] 的张量,train_mask(训练集掩码),val_mask(验证集掩码),test_mask(测试集掩码)

  • 通过打印data.y值可以看到是0,4,3这些数字代表所属的7个类别

  • 输入维度input_dim为1433,输出维度为7

  • log_softmax和nll_loss应该是这种分类问题专门使用的方法,得另外去学

1433 7
first torch.Size([2708, 1433])
conv1 torch.Size([2708, 16])
conv2 torch.Size([2708, 7])
x[0] tensor([ 0.0040,  0.0011,  0.0006,  0.0030,  0.0001, -0.0037,  0.0027],
       grad_fn=<SelectBackward0>)
max x[0] 0.0040496839210391045
Epoch 0, Loss: 1.9462064504623413
first torch.Size([2708, 1433])
conv1 torch.Size([2708, 16])
conv2 torch.Size([2708, 7])
x[0] tensor([ 0.0035,  0.0116, -0.0101,  0.0047,  0.0138,  0.0004, -0.0108],
       grad_fn=<SelectBackward0>)
max x[0] 0.01379104983061552
Accuracy: 0.2220
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
from torch_geometric.transforms import NormalizeFeatures

# 加载并预处理Cora数据集
dataset = Planetoid(root='/tmp/Cora', name='Cora', transform=NormalizeFeatures())

class GCN(torch.nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(GCN, self).__init__()
        self.conv1 = GCNConv(input_dim, hidden_dim)
        self.conv2 = GCNConv(hidden_dim, output_dim)

    def forward(self, x, edge_index):
        print(f"first {x.shape}")
        x = self.conv1(x, edge_index)
        print(f"conv1 {x.shape}")
        x = F.relu(x)
        x = self.conv2(x, edge_index)
        print(f"conv2 {x.shape}")
        print(f"x[0] {x[0]}")
        print(f"max x[0] {max(x[0])}")
        return F.log_softmax(x, dim=1)

# 数据集信息
data = dataset[0]
# print(f"data shape {len(data)}")
input_dim = dataset.num_node_features
hidden_dim = 16
output_dim = dataset.num_classes
print(input_dim, output_dim)

# for i in range(10):
#     print(f"{i}: {data.y[i]}")

# 初始化模型
model = GCN(input_dim, hidden_dim, output_dim)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

# 训练模型
model.train()
for epoch in range(1):
    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()
    if epoch % 10 == 0:
        print(f'Epoch {epoch}, Loss: {loss.item()}')

# 测试模型
model.eval()
_, pred = model(data.x, data.edge_index).max(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
accuracy = int(correct) / int(data.test_mask.sum())
print(f'Accuracy: {accuracy:.4f}')


  • 以下是chatgpt生成代码

应用:节点分类

节点分类任务的目标是根据节点的特征和图结构预测节点的类别。例如,在 Cora 数据集中,根据论文的特征和引用关系预测论文所属的领域。

使用 GCN 进行节点分类的示例代码

下面是一个使用图卷积网络(GCN)进行节点分类的完整示例代码,使用了 PyTorch 和 PyTorch Geometric 库。

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
from torch_geometric.transforms import NormalizeFeatures

# 加载并预处理Cora数据集
dataset = Planetoid(root='/tmp/Cora', name='Cora', transform=NormalizeFeatures())

class GCN(torch.nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(GCN, self).__init__()
        self.conv1 = GCNConv(input_dim, hidden_dim)
        self.conv2 = GCNConv(hidden_dim, output_dim)

    def forward(self, x, edge_index):
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = self.conv2(x, edge_index)
        return F.log_softmax(x, dim=1)

# 数据集信息
data = dataset[0]
input_dim = dataset.num_node_features
hidden_dim = 16
output_dim = dataset.num_classes

# 初始化模型
model = GCN(input_dim, hidden_dim, output_dim)
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(data.x, data.edge_index)
    loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
    loss.backward()
    optimizer.step()
    if epoch % 10 == 0:
        print(f'Epoch {epoch}, Loss: {loss.item()}')

# 测试模型
model.eval()
_, pred = model(data.x, data.edge_index).max(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
accuracy = int(correct) / int(data.test_mask.sum())
print(f'Accuracy: {accuracy:.4f}')

解释代码的每个部分

  1. 数据加载和预处理:

    dataset = Planetoid(root='/tmp/Cora', name='Cora', transform=NormalizeFeatures())
    
    • 使用 PyTorch Geometric 提供的 Planetoid 类加载 Cora 数据集,并对特征进行归一化。
  2. 定义 GCN 模型:

    class GCN(torch.nn.Module):
        def __init__(self, input_dim, hidden_dim, output_dim):
            super(GCN, self).__init__()
            self.conv1 = GCNConv(input_dim, hidden_dim)
            self.conv2 = GCNConv(hidden_dim, output_dim)
    
        def forward(self, x, edge_index):
            x = self.conv1(x, edge_index)
            x = F.relu(x)
            x = self.conv2(x, edge_index)
            return F.log_softmax(x, dim=1)
    
    • GCN 模型包含两个图卷积层(GCNConv)。第一个卷积层将输入特征映射到隐藏维度,第二个卷积层将隐藏特征映射到输出维度(类别数)。
  3. 初始化模型和优化器:

    input_dim = dataset.num_node_features
    hidden_dim = 16
    output_dim = dataset.num_classes
    
    model = GCN(input_dim, hidden_dim, output_dim)
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
    
    • 初始化 GCN 模型和 Adam 优化器。
  4. 训练模型:

    model.train()
    for epoch in range(200):
        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()
        if epoch % 10 == 0:
            print(f'Epoch {epoch}, Loss: {loss.item()}')
    
    • 训练 GCN 模型 200 个 epoch。每个 epoch 中,计算前向传播输出、损失值,反向传播梯度,并更新模型参数。
  5. 测试模型:

    model.eval()
    _, pred = model(data.x, data.edge_index).max(dim=1)
    correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
    accuracy = int(correct) / int(data.test_mask.sum())
    print(f'Accuracy: {accuracy:.4f}')
    
    • 在测试集上评估模型的性能,计算预测的准确率。

具体应用

使用 Cora 数据集进行节点分类任务有助于验证图神经网络在处理图结构数据方面的效果。实际应用中,这类方法可以用于:

  1. 社交网络:用户分类(例如,预测用户兴趣)。
  2. 生物信息学:蛋白质功能预测(例如,预测蛋白质的功能类别)。
  3. 推荐系统:用户和项目之间的关联预测(例如,根据用户的历史行为推荐新的项目)。
  4. 金融领域:欺诈检测(例如,通过交易网络检测欺诈行为)。

Cora 数据集和类似的数据集广泛用于研究和开发图神经网络模型,以解决上述各种图结构数据中的实际问题。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐