图神经网络与图卷积神经网络

图神经网络
应用领域:场景分析与问题推理,推荐系统,欺诈检测,知识图谱,道路交通流量预测,自动驾驶,无人机,化学,医疗,物理。
图的组成如下所示:提取特征。。。
在这里插入图片描述
图神经网络目的是整合特征,
在这里插入图片描述
图的邻接矩阵,
对于图像来说,每个像素点周围都有令居,A表示邻居之间的关系。
在这里插入图片描述
文本也可以表示为图的形式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图卷积神经网络

半监督学习!:不需要全部标签,少量标签也能训练!计算损失只用有标签的!

代码学习:

数据处理,数据集加载和转换

简单的图的展示:

import torch
from torch_geometric.data import Data

edge_index = torch.tensor([[0, 1, 1, 2],
                           [1, 0, 2, 1]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)

data = Data(x=x, edge_index=edge_index)
>>> Data(edge_index=[2, 4], x=[3, 1])

在这里插入图片描述
注意,edge_index,即定义所有边的源节点和目标节点的张量,并不是索引元组的列表。
edge_index only hold indices in the range { 0, …, num_nodes - 1},检查:data.validate(raise_on_error=True)
除了持有一些节点级、边级或图级属性外,Data还提供了一些有用的实用函数,例如:

print(data.keys())
>>> ['x', 'edge_index']

print(data['x'])
>>> tensor([[-1.0],
            [0.0],
            [1.0]])

for key, item in data:
    print(f'{key} found in data')
>>> x found in data
>>> edge_index found in data

'edge_attr' in data
>>> False

data.num_nodes
>>> 3

data.num_edges
>>> 4

data.num_node_features
>>> 1

data.has_isolated_nodes()
>>> False

data.has_self_loops()
>>> False

data.is_directed()
>>> False

# Transfer data object to GPU.
device = torch.device('cuda')
data = data.to(device)

让我们看一个例子,其中我们对ShapeNet数据集(包含来自16个形状类别的17,000个3D形状点云和每个点标签)应用变换。我们可以通过变换从点云生成最近邻图,将点云数据集转换为图数据集:

import torch_geometric.transforms as T
from torch_geometric.datasets import ShapeNet

dataset = ShapeNet(root='/tmp/ShapeNet', categories=['Airplane'],
                    pre_transform=T.KNNGraph(k=6))

dataset[0]
>>> Data(edge_index=[2, 15108], pos=[2518, 3], y=[2518])

此外,我们可以使用transform参数来随机增加一个Data对象,例如,将每个节点的位置转换一个小数字:

import torch_geometric.transforms as T
from torch_geometric.datasets import ShapeNet

dataset = ShapeNet(root='/tmp/ShapeNet', categories=['Airplane'],
                    pre_transform=T.KNNGraph(k=6),
                    transform=T.RandomJitter(0.01))

dataset[0]
>>> Data(edge_index=[2, 15108], pos=[2518, 3], y=[2518])

图 的方法

###加载数据
from torch_geometric.datasets import Planetoid

dataset = Planetoid(root='/tmp/Cora', name='Cora')
>>> Cora()
###这里不需太使用transforms or a dataloader

###配置两层的GCN
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(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)
###构造函数定义了两个GCNConv层,它们在网络的前向传递中被调用。请注意,非线性没有集成在conv调用中,因此需要
在之后应用(PyG中的所有操作符都是一致的)。在这里,我们选择使用ReLU作为我们的中间非线性,并最终在类的数量上
输出一个softmax分布。让我们在训练节点上训练这个模型200次:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().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).argmax(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
acc = int(correct) / int(data.test_mask.sum())
print(f'Accuracy: {acc:.4f}')
>>> Accuracy: 0.8150  
#这就是实现你的第一个图神经网络所需要的。学习更多关于图神经网络的最简单的方法是学习examples/目录中的示例,
并浏览torch_geometric.nn。黑客快乐!
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值