Graph Neural Networks 有关图的模型纵览

有关图的模型纵览

        从数据只能的存储模型(信息的抽取与存储)向图,动态模型的转变。可能模型中有隐形的结构,但感觉隐性的结构没有显性的快与易于引导与控制。

在这里插入图片描述
{ P r o p a g a t i o n   M o d u l e . 传 播 模 块 用 于 在 节 点 之 间 传 播 信 息 , 以 便 聚 合 的 信 息 能 够 捕 获 特 征 信 息 和 拓 扑 信 息 。 S a m p l i n g M o d u l e . 采 样 模 块 通 常 需 要 在 图 上 进 行 传 播 。 采 样 模 块 通 常 与 传 播 模 块 相 结 合 。 P o o l i n g M o d u l e . 当 我 们 需 要 高 级 子 图 或 图 的 表 示 时 , 需 要 池 化 模 块 来 从 节 点 提 取 信 息 。 \left\{\begin{array}{l} Propagation \ Module. {\tiny传播模块用于在节点之间传播信息,以便聚合的信息能够捕获特征信息和拓扑信息。}\\ Sampling Module. {\tiny采样模块通常需要在图上进行传播。采样模块通常与传播模块相结合。}\\ Pooling Module. {\tiny当我们需要高级子图或图的表示时,需要池化模块来从节点提取信息。} \end{array}\right. Propagation Module.便SamplingModule.PoolingModule.
P r o p a g a t i o n   M o d u l e { c o n v o l u t i o n o p e r a t o r r e c u r r e n t o p e r a t o r 卷 积 算 子 和 递 归 算 子 通 常 用 于 聚 合 来 自 邻 居 的 信 息 , 而 跳 过 连 接 操 作 用 于 从 节 点 的 历 史 表 示 中 收 集 信 息 , 并 缓 解 过 度 平 滑 ( o v e r − s m o o t h i n g ) 问 题 。 Propagation \ Module \left\{\begin{array}{l} convolution operator\\ recurrent operator \end{array}\right. \tiny 卷积算子和递归算子通常用于聚合来自邻居的信息,而跳过连接操作用于从节点的历史表示中收集信息,并缓解过度平滑(over-smoothing)问题。 Propagation Module{convolutionoperatorrecurrentoperator(oversmoothing)

GNN网络将图映射到输出通过以下两个步骤。

  1. 首先,通过传播(propagation step)的出每个节点的表示。
  2. 然后使用输出模型 o v = g ( h v , l v ) o_v = g(h_v, l_v) ov=g(hv,lv) 把每个节点的表示和标签映射为一个输出。
    为 了 使 用 一 般 方 法 处 理 图 整 体 的 分 类 , 也 有 模 型 建 议 构 造 一 个 通 过 特 殊 边 与 所 有 节 点 相 连 接 的 " s u p e r   n o d e " \tiny \color{red}为了使用一般方法处理图整体的分类,也有模型建议构造一个通过特殊边与所有节点相连接的"super \ node" 使,"super node"
    以下为一般GNN 模型的架构。
    在这里插入图片描述
    在这里插入图片描述

模型纵览的论文,结尾有实现代码链接
图卷积神经网络
RESIDUAL GATED GRAPH CONVNETS

GRAPH CONVOLUTIONAL NETWORKS
图神经网络
Transformers是一种图神经网络

可以通过dgl库实现,以下为github中得到的代码:

 -*- coding: utf-8 -*-

"""
==================================================
   File Name:     gcn.py
   email:         songdongdong@weidian.com
   Author :       songdongdong
   date:          2021/3/8 15:44
   Description :
   gcn图卷积网络,全称:graph convolutional networks 图卷积网络,提出于2017年,GCN的出现标志这图神经网络的出现,要说深度学习最常用的网络结构就是
        CNN,RNN。GCN与CNN不仅名字相似,其实理解起来也很类似,都是特征提取器。不同的是,CNN提取的张量数据特征,而GCN提出的是图数据特征

==================================================
"""

import torch
import torch.nn as nn
import torch.nn.functional as F

from dgl.nn.pytorch import GraphConv  # 这是一个图 DGL库
from dgl.data import CoraGraphDataset


class GCN(nn.Module):
    def __init__(self, g, in_feats,
                 n_hidden,
                 n_classes,
                 n_layers,
                 activation,
                 dropout):
        super(GCN, self).__init__()
        self.g = g
        self.layers = nn.ModuleList()
        # 输入层
        self.layers.append(GraphConv(in_feats, n_hidden, activation=activation))
        #
        for i in range(n_layers - 1):
            self.layers.append(GraphConv(n_hidden, n_hidden, activation=activation))
        # 输出层:
        self.layers.append(GraphConv(n_hidden, n_classes))
        self.dropout = nn.Dropout(p=dropout)

    def forward(self, features):
        h = features
        for i, layer in enumerate(self.layers):
            if i!=0:
                h = self.dropout(h)
            h = layer(self.g,h)
        return h
# @torch.no_grad()
def evalutate(model,features,labels,mask):
    model.eval()
    with torch.no_grad():
        logits = model(features)
        # print(logits)
        logits = logits[mask]
        labels = labels[mask]
        _,indices  = torch.max(logits,dim=1)
        correct = torch.sum(indices == labels)
        return correct.item() * 1.0 / len(labels)

def train( n_epochs=100,lr=1e-2,
           weight_decay=5e-4,n_hidden=16,
           n_layers=1,activation=F.relu,
           dropout=0.5):
    data = CoraGraphDataset()
    print(data)
    g = data[0]
    features = g.ndata['feat']
    labels = g.ndata['label']
    train_mask = g.ndata['train_mask'] #是true,fasle。其实就是样本提取
    val_mask = g.ndata['val_mask']
    test_mask = g.ndata['test_mask']
    in_feats = features.shape[1]
    n_classes = data.num_classes

    model  = GCN(g,in_feats,n_hidden,n_classes,n_layers,activation,dropout)

    loss_fcn = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(),lr=lr,weight_decay=weight_decay)

    for epoch in range(n_epochs):
        model.train()
        logits =model(features)
        loss = loss_fcn(logits[train_mask],labels[train_mask])
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        acc =evalutate(model,features,labels,val_mask)
        print("Epoch {} | Locc {:.4f} | accuracy {:.4f}".format(epoch,loss.item(),acc))
    print()
    acc =evalutate(model,features,labels,test_mask)
    print("Test accuracy {:.2%}".format(acc))

if __name__ == "__main__":
    train()

https://github.com/rexrex9/recbyhand

gnn
Graph_learning

www.bilibili.com

DGL官方教程–API–dgl.nn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值