ASGCN之图卷积网络(GCN)

2023-05-16


文章目录

  • 前言
  • 1. 理论部分
    • 1.1 为什么会出现图卷积网络?
    • 1.2 图卷积网络的推导过程
    • 1.3 图卷积网络的公式
  • 2. 代码实现
  • 参考资料


前言

本文从使用图卷积网络的目的出发,先对图卷积网络的来源与公式做简要介绍,之后通过一个例子来代码实现图卷积网络。


1. 理论部分

1.1 为什么会出现图卷积网络?

无论是CNN还是RNN,面对的都是规则的数据,面对图这种不规则的数据,原有网络无法对齐进行特征提取,而图这种数据在社会中广泛存在,需要设计一种方法对图数据进行提取,图卷积网络(Graph Convolutional Networks)的出现刚好解决了这一问题。
在这里插入图片描述

1.2 图卷积网络的推导过程

推导部分涉及通信相关知识,其主要核心是时域卷积等价于频域相乘,将时域卷积运算等价到频域进行相乘运算,再将相乘结果转化到时域。GCN的强悍之处在于,即使不训练,完全使用随机初始化的参数W,GCN提取出来的特征就以及十分优秀了。

1.3 图卷积网络的公式

公式由来请参考文献 图卷积网络(Graph Convolutional Networks, GCN)详细介绍,其网络的简易结构如下图所示。
在这里插入图片描述
图卷积的层与层之间的计算公式为:
H ( l + 1 ) = σ ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) \pmb{H^{(l+1)}=\sigma ( \tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}H^{(l)}W^{(l)} )} H(l+1)=σ(D~21A~D~21H(l)W(l))
式中:

A ~ \tilde{A} A~: A ~ = A + I \tilde{A}=A+I A~=A+I,A为图的邻接矩阵,I为单位矩阵;
D ~ \tilde{D} D~: D ~ \tilde{D} D~ A ~ \tilde{A} A~的度矩阵(degree matrix),表示每个结点度的数量, D i i = ∑ j = 1 i A i j D_{ii}=\sum_{j=1}^iA_{ij} Dii=j=1iAij;
H:每一层的特征,对于输入层,其是X;
σ \sigma σ:非线性激活函数;
W:连接层的权重参数;

2. 代码实现

在ASGCN中卷积层的计算公式为:
h i l = R e l U ( ∑ j = 1 n A i j W l g j l ) d i + 1 + b l ) \pmb{h_i^{l}=RelU(\frac{\sum_{j=1 }^{n} A_{ij} W^lg_{j}^{l})}{d_i+1}+b^l)} hil=RelU(di+1j=1nAijWlgjl)+bl)
依据计算公式构建代码如下:

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

class GraphConvolution(nn.Module):
    """
    Simple GCN layer, similar to https://arxiv.org/abs/1609.02907
    """
    def __init__(self, in_features, out_features):
        super(GraphConvolution, self).__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.weight = nn.Parameter(torch.FloatTensor(in_features, out_features))
        self.bias = nn.Parameter(torch.FloatTensor(out_features))

    def forward(self, text, adj):
        hidden = torch.matmul(text, self.weight) # 权重self.weight随机产生
        denom = torch.sum(adj, dim=1, keepdim=True) + 1  # 加一保证做除法时分母不为零
        output = torch.matmul(adj, hidden) / denom
        output = F.relu(output + self.bias)
        print(output)
        return output
def main():
    # 假设该句子经过构建依赖树后的邻接矩阵为adj
    adj =torch.tensor([
        [1., 1., 0., 0., 0., 0., 0., 1., 0., 0.],
        [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 1., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 0., 1., 0., 0., 0., 1.],
    ])
    # 假设一个句子中有10个单词,从前向后单词对应的索引为[0, 1, 2, 3, 3, 4, 6,0, 1, 2]
    input = torch.tensor([0, 1, 2, 3, 3, 4, 6,0, 1, 2], dtype=torch.long)
    embedding = torch.nn.Embedding(10, 50)
    x = embedding(input)  # 生成每个单词对应的词嵌入,维度为50
    gc1 = GraphConvolution(50, 10)
    gc1(x, adj)
if __name__ == '__main__':
    main()

输出:
tensor([[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07, 3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07, 3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21],
[1.1561e+19, 6.8794e+11, 2.7253e+20, 3.0866e+29, 1.1547e+19, 4.1988e+07,3.0357e+32, 1.1547e+19, 6.4069e+02, 4.3066e+21]],
grad_fn=)


参考资料

  1. 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
  2. 图卷积网络(Graph Convolutional Networks, GCN)详细介绍
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASGCN之图卷积网络(GCN) 的相关文章

  • HJ003 明明的随机数

    目录 题目描述 输入描述 输出描述 输入 输出 说明 做题思路 AC代码 题目描述 明明想在学校中请一些同学一起做一项问卷调查 xff0c 为了实验的客观性 xff0c 他先用计算机生成了N个1到1000之间的随机整数 xff08 N 10
  • new,delete使用详解(动态多维数组空间申请)

    C语言中利用库函数malloc和free来分配和撤销空间的 C 43 43 中的new与delete是运算符 xff0c 不是函数 xff0c 所以执行效率更高 但C 43 43 中也是可以使用malloc和free的 但是一来不方便 xf
  • 局部,全局(外部),static等变量详解

    首先 xff0c 必须明白一个程序是包含若干个源文件 xff0c 每个源文件又是包含若干个函数 xff0c 每个源文件 函数中又定义了若干个变量 但是每个变量都有自己的作用范围 xff0c 也就是自己的作用域 只有在作用域内才可以访问变量
  • 函数的可变参数的实现

    stdarg h stdarg h是C语言中C标准函数库的头文件 xff0c stdarg是由standard xff08 标准 xff09 arguments xff08 参数 xff09 简化而来 xff0c 主要目的为让函数能够接收可
  • 常见的注入方式

    设计模式中常见的注入方式 依赖注入 最近在求职 xff0c 耽搁了 xff0c 对于应届生来讲想找个大数据相关的工作何其困难 所以在填充一些自己不足之处 xff0c 希望与君共勉 一 依赖注入DI 开发过程中 xff0c 如果发现客户程序依
  • 部分Fortify代码扫描高风险解决方案

    部分Fortify代码扫描高风险解决方案 一 Category Access Control Database 问题描述 xff1a Database access control 错误在以下情况下发生 xff1a 1 数据从一个不可信赖的

随机推荐

  • 中标麒麟高级服务器V7安装

    中标麒麟高级服务器V7安装 中标麒麟高级服务器操作系统软件 xff08 兆芯版 xff09 一 安装步骤 准备 xff1a 1 相关中标麒麟镜像 2 vncviewer xff0c 由它去远程连接服务器上的机器节点 1 首先进入界面呈现 该
  • Hive--OR-AND使用方法

    OR AND 数据源 xff1a 1 22 1 21 2 22 1 20 select from id age where id 61 1 or id 61 2 and age 61 22 表示 xff1a 查询id 61 1 同时age
  • gdb 打印内存和数组

    打印数组 xff1a p arrayPtr 64 256 打印256个数组元素类型元素值 xff0c 二元操作符 64 左边数组第一个元素 xff0c 右边数组长度 p x char arrayPtr 64 256 以16进制打印256个以
  • Hive--清除/删除Hive表数据,where条件

    清除Hive表数据 hive删除表 xff1a drop table table name hive删除表中数据 xff1a truncate table table name hive按分区删除数据 xff1a alter table t
  • Mysql--查询时使用SQL将字段的数据类型转换(varchar->int)

    查询时使用SQL将数据类型转换 在 span class token keyword sql span 里面String转 span class token keyword int span span class token punctua
  • Mysql项目实践常用操作汇总(不断更新)

    MySQL 1 主键 xff0c 索引 xff0c 引擎 CREATE TABLE 96 表名 96 96 列名1 96 int 11 NOT NULL 96 列名2 96 varchar 255 NOT NULL PRIMARY KEY
  • 大文件处理方案

    处理海量数据问题 xff0c 无非就是 xff1a 分而治之 hash映射 43 hash统计 43 堆 快速 归并排序 xff1b Bloom filter Bitmap xff1b Trie树 数据库 倒排索引 xff1b 外排序 xf
  • spark读取嵌套json代码测试示例

    示例一 示例数据 xff1a span class token punctuation span span class token string 34 name 34 span span class token operator span
  • Redis集群原理和总结

    Redis集群原理 节点主从 xff08 镜像全量 xff09 43 哈希slot xff08 分片 xff09 无主模型 遵循 CAP原则 C一致性 A可用性 P分区容错性 xff0c 三者不可兼得 数据放在大数据集群中的方式 集群承载数
  • Hbase基础

    Hbase 谷歌 BigTable论文 海量存储 列式存储 极易扩展 RS HDFS 高并发 稀疏性 主要是针对Hbase列的灵活性 xff0c 在列族中 xff0c 你可以指定任意多的列 xff0c 在列数据为空的情况下 xff0c 是不
  • Flink

    Flink 一 简介 Flink核心是一个流式的数据流执行引擎 xff0c 其针对数据流的分布式计算提供了数据分布 数据通信以及容错机制等功能 基于流执行引擎 xff0c Flink提供了诸多更高抽象层的API以便用户编写分布式任务 xff
  • SUMO学习入门 (二)路网文件的生成

    声明 xff1a 该文章为博主转载自知乎用户 xff1a 侘寂升平 xff0c 侵删 xff01 非常感谢知乎朋友无私分享的sumo系列文章 xff0c 给了我很多的指导 xff01 欢迎读者关注该博主 xff01 以下为转载正文 xff1
  • 第七章 结构体

    文章目录 前言一 结构体与结构体指针1 结构体的定义 引用与初始化2 结构体指针3 typedef的使用A typedef结构体B typedef整型 二 C 43 43 的引用1 数字2 指针 前言 本文主要介绍结构体的使用 一 结构体与
  • Mapreduce实例(七):二次排序

    系统环境 Linux Ubuntu 16 04 jdk 7u75 linux x64 hadoop 2 6 0 cdh5 4 5 hadoop 2 6 0 eclipse cdh5 4 5 jar eclipse java juno SR2
  • WiFiduino+blinker+小爱同学打造智慧卧室

    系列文章目录 文章目录 系列文章目录前言一 实现功能二 所需材料三 导线连接四 软件开发1 开发环境搭建2 编写程序 五 手机操作部分1 blinkerAPP2 米家APP3 小米音箱APP 六 实物部分1 实物图片 总结 前言 本科二年级
  • 深度学习实际—手写体识别

    文章目录 前言1 什么是机器识别手写数字 xff1f 2 MNIST数据集是什么 xff1f 3 显示MNIST数据集4 名词解释4 1 图像4 2 卷积层4 3 池化层4 4 线性层4 5 激活函数4 6 损失函数 https blog
  • 简易计时器开发

    一 项目场景 xff1a 事情是这样的 xff0c 学校给了一个网页 xff0c 让我们去学习 xff0c 网页超过5分钟无操作会自动跳出 xff0c 需要一个定时器来提醒我们每隔一段时间去操作网页 xff0c 我在网上查了几个定时器 xf
  • 第9章 无监督学习

    系列文章目录 第1章 绪论 第2章 机器学习概述 第3章 线性模型 第4章 前馈神经网络 第5章 卷积神经网络 第6章 循环神经网络 第7章 网络优化与正则化 第8章 注意力机制与外部记忆 第9章 无监督学习 第10章 模型独立的学习方式
  • 第1章 计算机组成原理概述

    文章目录 前言1 0 课程简介1 0 1 课程的地位1 0 2 课程学习思路1 0 3 课程组成 1 1 计算机系统简介1 1 1 计算机组成1 计算机的类型2 计算机的组成3 软件组成 1 1 2 计算机系统的层次结构1 物理层方面2 程
  • ASGCN之图卷积网络(GCN)

    文章目录 前言1 理论部分1 1 为什么会出现图卷积网络 xff1f 1 2 图卷积网络的推导过程1 3 图卷积网络的公式 2 代码实现参考资料 前言 本文从使用图卷积网络的目的出发 xff0c 先对图卷积网络的来源与公式做简要介绍 xff