DW_图深度学习_Task_1

DW_图深度学习_Task_1
学习内容:简单图论与环境配置及PyG库使用
学习地址: github/datawhalechina/team-learning-nlp/GNN/

学习笔记

  • 简单图论
    • 内容框架
    • 勘误
  • 环境配置及PyG库使用
    • 环境配置
      • 检查显卡驱动
      • 安装正确版本的pytorch和cudatoolkit
    • Data类——PyG中图的表示及其使用
      • Data类的创建
      • 数据转换
    • Dataset类——PyG中图数据集的表示及其使用
      • 生成Planetoid数据集类并分析
      • 数据集的使用

简单图论

内容框架

DW_图深度学习_Task_1_第1张图片

勘误

  • 笔误DW_图深度学习_Task_1_第2张图片
    DW_图深度学习_Task_1_第3张图片

  • 存疑:这里的权重是否应该是区域范围值 [0, 1]而不是{0, 1}
    DW_图深度学习_Task_1_第4张图片

  • 错误:根据公式,应该是最短路径的最大值
    DW_图深度学习_Task_1_第5张图片

环境配置及PyG库使用

环境配置

检查显卡驱动

DW_图深度学习_Task_1_第6张图片

安装正确版本的pytorch和cudatoolkit

DW_图深度学习_Task_1_第7张图片

Data类——PyG中图的表示及其使用

Data类的创建

构造函数

class Data(object):

    def __init__(self, x=None, edge_index=None, edge_attr=None, y=None, **kwargs):

        self.x = x
        self.edge_index = edge_index
        self.edge_attr = edge_attr
        self.y = y

        for key, item in kwargs.items():
            if key == 'num_nodes':
                self.__num_nodes__ = item
            else:
                self[key] = item

数据转换

  1. dict对象转换为Data对象
  2. Data对象转换为dict对象或namedtuple对象

Dataset类——PyG中图数据集的表示及其使用

生成Planetoid数据集类并分析

数据获取: 下载遇到问题的解决方案
查看数据集中的样本:

data = dataset[0]
data.is_undirected()
# True
data.train_mask.sum().item()
# 140
data.val_mask.sum().item()
# 500
data.test_mask.sum().item()
# 1000

数据集的使用

import torch
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv

#数据集加载
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root='./dataset/Cora', name='Cora')

#定义网络Net()
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, data):
        x, edge_index = data.x, data.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 = Net().to(device)
data = dataset[0].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(data)
    loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
    loss.backward()
    optimizer.step()

#测试
model.eval()
_, pred = model(data).max(dim=1)
correct = float(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item())
acc = correct / data.test_mask.sum().item()
print('Accuracy: {:.4f}'.format(acc))

你可能感兴趣的:(图深度学习,深度学习,图论)