【源码复现】《Towards Deeper Graph Neural Networks》

news2024/11/17 0:49:26

目录

  • 1、论文简介
  • 2、论文核心介绍
    • 2.1、基本概述
    • 2.2、模型介绍
  • 3、源码复现
    • 3.1、torch复现
    • 3.2、DGL复现

1、论文简介

  • 论文题目——《Towards Deeper Graph Neural Networks》
  • 论文作者——Meng Liu, Hongyang Gao & Shuiwang Ji
  • 论文地址——Towards Deeper Graph Neural Networks
  • 源码——源码链接

2、论文核心介绍

2.1、基本概述

 GCN模型和GAT模型仅仅是减缓了过平滑问题,网络层数并没有达到深层。SGC采用图卷积矩阵的k次幂在单层的神经网络中试图去捕获高阶的邻域信息。PPNP和APPNP用个性化页面排名矩阵取图卷积矩阵克服了过平滑问题。然而这些方法在每一层线性聚合邻域表征,失去了深度非线性架构强大的表达能力,这意味着他们仍然是浅层的网络。那图神经网络真的可以达到深层吗?答案是肯定的!
 本文介绍的DAGNN模型就是解决过平滑问题并使网络加深的一个模型。DAGNN将变换和传播分离,传播k次后,局部邻域和大的邻域信息可以被学习到,通过一个自适应调节机制,平衡局部邻域信息和全局邻域信息。

2.2、模型介绍

 大多数图卷积操作通过邻域信息传播聚合邻域表征,之后实施一个变换操作。普通图卷积的第 l l l层操作可以描述为:
h i ( l ) = PROPAGATION ( l ) ( { x i ( l − 1 ) , { x j l − 1 ∣ j ∈ N i } } ) h_i^{(l)} = \text{PROPAGATION}^{(l)}(\{x_i^{(l-1)},\{x_j^{l-1}|j \in \mathcal{N}_i\}\}) hi(l)=PROPAGATION(l)({xi(l1),{xjl1jNi}})
x i ( l ) = TRANSFORMATION ( l ) ( a i ( l ) )              x_i^{(l)}=\text{TRANSFORMATION}^{(l)}(a_i^{(l)})\;\;\;\;\;\; xi(l)=TRANSFORMATION(l)(ai(l))
 基于上述操作,那存在的问题是什么呢?首先,直觉上,表征变换和表征传播交织在一起,即变换操作中的参数和传播中的感受域交织。一跳邻域需要一个变换函数,那么当考虑到更大的邻域时会需要更多的参数,进而导致很难训练一个具有大量参数的深层图神经网络。其次,再结点分类任务中,一个具有两层的多层感知机不考虑图结构,仅仅使用初始特征 X X X作为输入,也可以达到不错的性能。基于图结构的信息传播则是帮助减轻分类任务,使同一个类的结点表征更相似。因此,从特征和图结构的角度来看,表征变换和表征传播发挥着不同的作用。DAGNN模型则是采用传播和变换分离的策略,得到如下的模型:

Z = MLP ( X )              Z = \text{MLP}(X)\;\;\;\;\;\; Z=MLP(X)
X o u t = softmax ( A ^ k Z )              X_{out} = \text{softmax}(\hat{A}^kZ)\;\;\;\;\;\; Xout=softmax(A^kZ)

 然而,不考虑中间表征,仅仅使用传播k次之后的表征很难获得充分关键的邻域信息,同时也会带来更多的全局信息而稀释了局部的信息,为此,在传播之后,DAGCN采用自适应调节机制来平衡局部邻域信息和全局邻域信息,来决定不同传播层获得的邻域信息有多少应该被保留来生成每个结点的最终表示。DAGNN模型公式描述如下,模型框架如下图所示。
Z = MLP ( X ) Z = \text{MLP}(X) Z=MLP(X)
H l = A ^ Z , l = 1 , 2 , . . . , k H_l= \hat{A}Z,l=1,2,...,k Hl=A^Z,l=1,2,...,k
H = stack ( Z , H 1 , . . . , H k ) H = \text{stack}(Z,H_1,...,H_k) H=stack(Z,H1,...,Hk)
S = σ ( H s ) S = \sigma(Hs) S=σ(Hs)
S ~ = reshape ( S ) \tilde{S} =\text{reshape}(S) S~=reshape(S)
X o u t = softmax ( sqeeze ( S ~ H ) ) X_{out} = \text{softmax}(\text{sqeeze}(\tilde{S}H)) Xout=softmax(sqeeze(S~H))
在这里插入图片描述

3、源码复现

 本节介绍了DAGNN的源码复现,主要将模型的代码放在了下面,如果需要详细的源码,请参看百度云链接。

链接:https://pan.baidu.com/s/1DofAHZbSp5Zf4uKMlriaBA
提取码:6666

3.1、torch复现

import torch
from torch.nn import Module
import torch.nn as nn
from torch.nn.parameter import Parameter
from torch.nn import functional as F

class DAGNN(nn.Module):
    def __init__(self,input_dim,hid_dim,output_dim,model,k,dropout):
        super(DAGNN,self).__init__()

        self.input_dim = input_dim
        self.hid_dim = hid_dim
        self.output_dim = output_dim
        self.model = model
        self.k = k
        self.dropout = dropout
        #法一
        #self.s = Parameter(torch.empty(size=(output_dim,1)))
        #nn.init.xavier_uniform_(self.s.data,gain=1.414)
        #法二
        self.project = nn.Linear(output_dim,1)
        self.init_param()
    def init_param(self):
        #kaiming 初始化
        self.project.reset_parameters()
    def forward(self,feature,adj):
        Z = self.model(feature)

        prop_matrix = [Z]
        for _ in range(self.k):
            Z = torch.mm(adj,Z)
            prop_matrix.append(Z)
        H = torch.stack(prop_matrix,dim=1)
        #S = F.sigmoid(torch.matmul(H,self.s))
        S = F.sigmoid(self.project(H))
        
        #转置
        S = S.transpose(2,1)
        out = torch.squeeze(torch.matmul(S,H))
        return F.log_softmax(out,dim=1)

class MLP(Module):
    def __init__(self,input_dim,hid_dim,output_dim,dropout):
        super(MLP,self).__init__()
        self.input_dim = input_dim
        self.hid_dim = hid_dim
        self.output_dim = output_dim
        self.dropout = dropout
        self.layer1 = nn.Linear(input_dim,hid_dim)
        self.layer2 = nn.Linear(hid_dim,output_dim)
        self.init_param()
    def init_param(self):
        self.layer1.reset_parameters()
        self.layer2.reset_parameters()

    def forward(self,X):
        X = F.dropout(X,self.dropout,training=self.training)
        X = self.layer1(X)
        X = F.relu(X)
        X = F.dropout(X,self.dropout,training=self.training)
        X = self.layer2(X)
        return X
    def __repr__(self) -> str:
        return self.__class__.__name__

3.2、DGL复现

import os
os.environ["DGLBACKEND"] = "pytorch"
import dgl
import dgl.function as fn
import torch 
import torch.nn as nn
import torch.nn.functional as F
from dgl.nn.pytorch.conv import GATConv


class DAGNNLayer(nn.Module):
    def __init__(self,infeat,k) -> None:
        super(DAGNNLayer,self).__init__()
        self.k = k
        self.s = nn.Linear(infeat,1,bias=False)
        self.s.reset_parameters()
    def forward(self,feat,g):
        with g.local_scope():
            results = [feat]

            g = dgl.add_self_loop(g)
            #计算正则
            degs = g.in_degrees().to(feat).clamp(min=1)
            norm = torch.pow(degs,-0.5)
            norm = norm.to(feat.device).unsqueeze(1)
            
            for _ in range(self.k):
                feat = feat * norm
                g.ndata['h'] = feat
                g.update_all(fn.copy_u('h','m'),fn.sum('m','h'))
                feat = g.ndata['h'].to(feat)
                feat = feat * norm
                results.append(feat)

            H = torch.stack(results,dim=1)
            S = F.sigmoid(self.s(H))
            S  = S.permute(0,2,1)
            out = torch.matmul(S,H).squeeze()
            return out

class DAGNN(nn.Module):
    def __init__(self,infeat,hidfeat,outfeat ,dropout,k) -> None:
        super(DAGNN,self).__init__()
        self.dropout = dropout

        self.layer1 = nn.Linear(infeat,hidfeat,bias=False)
        self.layer2 = nn.Linear(hidfeat,outfeat,bias=False)
        self.DAGNNLayer = DAGNNLayer(outfeat,k)
        self.init_param()
    def init_param(self):
        self.layer1.reset_parameters()
        self.layer2.reset_parameters()
    def forward(self,x,g):
        x = F.dropout(x,self.dropout,training=self.training)
        x = F.relu(self.layer1(x))
        x = F.dropout(x,self.dropout,training=self.training)
        x = self.layer2(x)
        x = self.DAGNNLayer(x,g)

        return F.log_softmax(x,dim=1)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何给pycharm配置解释器

目录 给pycharm配置解释器 给pycharm配置解释器 选择show all 选择已经存在的环境 其中的py38是我通过conda创建的虚拟环境。

BearPi Std 板从入门到放弃 - 筑基(1)(RT-Thread 智慧路灯)

简介 使用BearPi IOT Std开发板及其扩展板E53_SC1, SC1上有I2C1 的光照强度传感器BH1750 和 EEPROM AT24C02, 智慧路灯功能, 实现亮度达到对应阈值则开启点灯 主板: 主芯片: STM32L431RCT6LED : PC13 \ 推挽输出\ 高电平点亮串口: Usart1I2C使用 : I2C…

排序算法(二)-冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序

排序算法(二) 前面介绍了排序算法的时间复杂度和空间复杂数据结构与算法—排序算法(一)时间复杂度和空间复杂度介绍-CSDN博客,这次介绍各种排序算法——冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序。 文章目录 排序算法(二)…

transformer文章翻译【Attention is all you need】

参考博客:https://blog.csdn.net/nocml/article/details/103082600 论文目录 摘要1. Introduction2. Background3. Model Architecture3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Multi-Head Attention3.2.3 Application…

实验室移液器配套PFA吸头性能稳定特氟龙吸头特点

PFA吸头是一种高性能移液器配件,由聚全氟丙烯(Perfluoroalkoxy)材料制成。这种材料具有优异的耐化学品、耐热和电绝缘性能,使得PFA吸头在应用中表现出色。 首先,PFA吸头具有卓越的耐化学腐蚀性能。无论是酸性溶液、碱性…

环境保护:人类生存的最后机会

随着科技的进步和人类文明的不断发展,地球上的自然资源也在以惊人的速度消耗殆尽。人类对于环境的无止境的掠夺,使得我们的地球正面临着前所未有的环境危机。环境污染、全球变暖、大规模灭绝等问题不断困扰着我们,似乎指向了人类生存的最后机…

世微AP5414 锂电池升降压 恒流恒压 LED电源驱动IC

产品简介 AP5414 是一种输入电压范围宽(0.8~5.5V),可调恒定电流和限定电流两种模式来 驱动白光 LED 而设计的升压型 DC/DC 变换器。该器件能利用单节或双节干电池驱动单 颗大功率白光 LED,同样可以利用一节锂电池驱动两颗、三颗或…

docker gpu 详细部署 video-retalking(跟着步骤打指令就完事了)

本地操作系统:centos 搞个小塔 1、首先在centos下安装宝塔(后面会用到) 建个容器 2、根据自己要的python版本修改一下语句,这里拉取的是python3.8.8的镜像 docker run -itd --name video-retalking --gpus all --shm-size&qu…

医院污水处理设备远程监控超标报警解决方案

行业背景 近年来,我国医疗机构建设得到了巨大的发展。根据《2022年我国卫生健康事业发展统计公报》,2022年末,全国医疗卫生机构总数达1032918个。截至2022年10月,根据全国排污许可证管理信息平台,共有 13316家医院核发…

ElasticSearch - networking配置global

版本8.11 单机部署了一个节点 在elasticsearch.yml中 配置了network.host: 8.8.8.8(之前为127.0.0.1) 但启动服务失败 报错信息为: BindTransportException: Failed to bind to 8.8.8.8:[9300-9399] 为啥要配置8.8.8.8 是因为参考的官方说明 Networking | Elasticsearch Gu…

RHEL8_Linux下载ansible

本章内容主要介绍RHEL8中如何安装ansible ansible时如何工作的在RHEL8中安装ansible 1.ansible工作原理 如果管理的服务器很多,如几十台甚至几百台,那么就需要一个自动化管理工具了,ansible就是这样的一种自动化管理工具。 1&…

AWS Ubuntu设置DNS解析(解决resolve.conf被覆盖问题)

众所周知: Ubuntu在域名解析时,最直接使用的是/etc/resolve.conf文件,它是/run/systemd/resolve/resolve.conf的软链接,而对于刚装完的ubuntu系统,该文件的内容如下 ubuntuip-172-31-36-184:/etc$ cat resolv.conf #…

Mysql workbench

下载地址: https://download.csdn.net/download/a876106354/88616595

EasyExcel实现⭐️本地excel数据解析并保存到数据库的脚本编写,附案例实现

目录 前言 一、 EasyExcel 简介 二、实战分析 1.Controller控制层 2. service方法和方法实现 3.EasyExcel相关类 3.1 excel表实体类 3.2 自定义监听器类 4.测试 4.1 准备工作 4.2 断点调试 5.生成脚本文件 三、分析总结 章末 小伙伴们大家好,最近开发的时…

spring 笔记三 Spring与Web环境集成

文章目录 Spring与Web环境集成ApplicationContext应用上下文获取方式导入Spring集成web的坐标置ContextLoaderListener监听器通过工具获得应用上下文对象SpringMVC概述SpringMVC快速入门 Spring与Web环境集成 ApplicationContext应用上下文获取方式 应用上下文对象是通过new …

QT-CAD-3D显示操作工具

QT-CAD-3D显示操作工具 一、效果展示二、核心程序三、程序链接 一、效果展示 二、核心程序 TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) {TDF_LabelSequence seqLabel;Handle_XCAFDoc_ShapeTool shapeTool doc->xcaf().shapeTool();…

ProcessOn在线绘制部分项目流程图

目录 一、ProcessOn 1.1 简介 1.2 官方网站 二、Axure自定义元件库 2.1 新建元件库 2.2 自定义元件 2.3 添加元件库 三、HIS系统门诊流程图 四、HIS系统住院流程图 五、HIS系统药品采购入库流程图 六、OA会议流程图 一、ProcessOn 1.1 简介 ProcessOn是一款在线的流…

快递鸟「物流导盲犬」助力鞋服头部企业客户全链路物流数字化升级

数字化时代,企业全域经营已成为数字商业新浪潮,多店铺多平台多仓库同步发货成为经营常态,消费者对物流服务体验的要求越来越高,企业对物流精细化管理的需求也越来越强烈。快递鸟基于对物流数字化领域的深耕和对行业及客户需求的深…

域名备案通过啦

整体来看还算比较顺利:遇到的问题: 1.香港服务器没有免费的备案码,就单独购买一个备案码用于备案。 2.备案的时候小程序审核优先通过,导致阿里云备案域名不能使用初次备案,不能通过初审,就放弃重新申请备…

css画饼图

<template slot-scope"scope"> <div class"pie" :style"{--p: scope.row.rate}" style"--p:10;--b:10px;--c:#FFAB79;"> <!-- --p&#xff1a;这个变量应该包含百分比值作为一个数字&#xff08;不带%符号&#xff09;…