如何理解图卷积网络GCN

文章目录

  • 基本概念
    • 度矩阵(degree)
    • 邻接矩阵(Adjacency)
  • 理解GCN
    • 两层GCN
    • 网络层数设置
  • 搭建GCN网络
    • 定义GCN层
    • 定义GCN网络

基本概念

图的一些基本知识:图,邻居,度矩阵,邻接矩阵

度矩阵(degree)

度矩阵是对角矩阵,对角上的元素表示每个顶点的度,也就是该顶点相关联的边的数量。

邻接矩阵(Adjacency)

邻接矩阵表示顶点间的关系,矩阵元素为0或1。无向图邻接矩阵是对称矩阵,有向图的邻接矩阵不一定对称。如下图所示
在这里插入图片描述

理解GCN

如何理解 Graph Convolutional Network(GCN)?

GCN,图卷积神经网络,实际作用和CNN一样,是一个特征提取器。

假设有一批图数据。图中有 N N N个节点,每个节点都有自己的特征( D D D维),设这些节点特征组成 N ∗ D N*D ND维的矩阵 X X X,各个节点之间的关系形成一个 N ∗ N N*N NN维的邻接矩阵 A A A。将 X X X A A A输入图卷积神经网络。其中 X X X代表节点的特征, A A A代表边的特征。

GCN的传播方式为:

在这里插入图片描述

其中,

  1. A ~ = A + I \tilde{A} = A + I A~=A+I(这一步是为了将node自身的特征进行运算,相当于add self loop)
  2. D ~ \tilde{D} D~为度矩阵,可以由 A ~ \tilde{A} A~计算得到。 D ~ \tilde{D} D~的作用是将 A ~ \tilde{A} A~归一化,使每行加起来为1。
  3. σ \sigma σ是激活函数
  4. H H H是当前层的特征,对于输入层的话,相当于 X X X

两层GCN

D ~ − 1 / 2 A ~ D ~ − 1 / 2 \tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2} D~1/2A~D~1/2看作一个整体 A ^ \hat{A} A^,则对于一个两层的GCN,激活函数分别采用ReLU和Softmax,整体的正向传播的公式为:

s o f t m a x ( A ^ R e L U ( A ^ X W 0 ) W 1 ) softmax(\hat{A}ReLU(\hat{A}XW^0)W^1) softmax(A^ReLU(A^XW0)W1)

网络层数设置

在GCN网络深度的对比研究中,2-3层就可以达到比较好的效果。

搭建GCN网络

[图神经网络]PyTorch简单实现一个GCN

定义GCN层

可以调用 torch_geometric.nn 中的 GCNConv 进行实现。
torch_geometric.nn

class GCNConv(MessagePassing):def __init__(self, in_channels, out_channels, add_self_loops=True, bias=True):super(GCNConv, self).__init__()self.add_self_loops = add_self_loopsself.edge_index = Noneself.linear = pyg_nn.dense.linear.Linear(in_channels, out_channels, weight_initializer='glorot')if bias:self.bias = nn.Parameter(torch.Tensor(out_channels, 1))self.bias = pyg_nn.inits.glorot(self.bias)else:self.register_parameter('bias', None)# 1.消息传递def message(self, x, edge_index):# 1.对所有节点进行新的空间映射x = self.linear(x) # [num_nodes, feature_size]# 2.添加偏置if self.bias != None:x += self.bias.flatten()# 3.返回source、target信息,对应边的起点和终点row, col = edge_index # [E]# 4.获得度矩阵deg = degree(col, x.shape[0], x.dtype) # [num_nodes]# 5.度矩阵归一化deg_inv_sqrt = deg.pow(-0.5) # [num_nodes]# 6.计算sqrt(deg(i)) * sqrt(deg(j))norm = deg_inv_sqrt[row] * deg_inv_sqrt[col] # [num_nodes]# 7.返回所有边的映射x_j = x[row] # [E, feature_size]# 8.计算归一化后的节点特征x_j = norm.view(-1, 1) * x_j # [E, feature_size]return x_j# 2.消息聚合def aggregate(self, x_j, edge_index):# 1.返回source、target信息,对应边的起点和终点row, col = edge_index # [E]# 2.聚合邻居特征aggr_out = scatter(x_j, row, dim=0, reduce='sum') # [num_nodes, feature_size]return aggr_out# 3.节点更新def update(self, aggr_out):# 对于GCN没有这个阶段,所以直接返回return aggr_outdef forward(self, x, edge_index):# 2.添加自环信息,考虑自身信息if self.add_self_loops:edge_index, _ = add_self_loops(edge_index, num_nodes=x.shape[0]) # [2, E]return self.propagate(edge_index, x=x)

self.propagate 会依次调用message, aggregate, update,完成消息的传递、聚合、更新。

定义GCN网络

class GCN(nn.Module):def __init__(self, num_node_features, num_classes):super(GCN, self).__init__()self.conv1 = GCNConv(num_node_features, 16)self.conv2 = GCNConv(16, num_classes)def forward(self, data):x, edge_index = data.x, data.edge_indexx = 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)

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

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

相关文章

Git - 多账户

不想在不同的托管平台或者不同的账号使用同一个秘钥 使用-f参数创建多个秘钥并添加到对应平台&#xff0c;Git - 秘钥创建修改~/.ssh/config&#xff0c;格式如下新格式仓库地址&#xff1a;<主机名>:<仓库所有者>/<仓库名>.git # ~/.ssh/config # 主机名随…

热门API接口大全分享,含免费次数

热门API接口大全分享&#xff0c;含天气、物流等。。。 天气预报查询&#xff1a;查询全国以及全球多个城市的天气&#xff0c;包含15天天气预报查询。天气预警&#xff1a;可以获取指定城市当前生效中的各类天气预警&#xff0c;如寒潮蓝色预警信号&#xff0c;或一次性拉取全…

【力扣100】22.括号生成 || 为什么搜索几乎都是用深度优先遍历?

添加链接描述 class Solution:def generateParenthesis(self, n: int) -> List[str]:# 思路是根据左右括号剩余数量进行生成# 剩余左括号小于剩余右括号时&#xff0c;可以加左或者加右# 剩余左括号大于剩余右括号时&#xff0c;舍弃def backtrack(cur,left,right,res):if …

.NET DevOps 接入指南 | 1. GitLab 安装

引言 容器、DevOps和微服务被称为驱动云原生快速发展的三架马车。而DevOps是其中非常重要的一环&#xff0c;DevOps 是由Developers&#xff08;Dev&#xff09;和Operations&#xff08;Ops&#xff09;两个单词简称组成&#xff0c;中文直译就是“开发运维一体化”。 DevOps…

Spring-AOP综述

文章迁移自语雀。 今天下雪了, 完成了spring aop的应用学习, 学到了以前很多忽略的知识点,也写完了各种试验. 今天给程程分享了很多了随州下雪的场景,写了一二三, ♡程程, i miss u 等字体,在雪地上写给程程看, 还拍摄了照片和视频给她, 上午的时候,还做了一个雪人, 哈哈哈, 她…

防勒索病毒攻击的关键措施

【作者】朱向东 中原银行 高级工程师 在当今数字化时代&#xff0c;勒索病毒成为了企业和个人面临的一项严峻威胁。勒索病毒攻击可以导致数据丢失、系统瘫痪以及经济损失。为了保护自己和组织的利益&#xff0c;采取一系列的防范措施是至关重要的。下面是一些关键的措施&#…

zlib.decompressFile报错 【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:方案1方案2此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了zlib.decompressFile报错 的问题。 问题: zlib.decompressFile报错,怎么解…

Find My帽子|苹果Find My技术与帽子结合,智能防丢,全球定位

帽子是戴在头部的服饰&#xff0c;多数可以覆盖头的整个顶部。主要用于保护头部&#xff0c;部分帽子会有突出的边缘&#xff0c;可以遮盖阳光。帽子亦可作打扮之用&#xff0c;也可以用来保护发型、遮盖秃头。可不同种类&#xff0c;例如贝雷帽、鸭舌帽等等。戴帽子在不同的地…

Java 8 中的 Stream 轻松遍历树形结构!

可能平常会遇到一些需求&#xff0c;比如构建菜单&#xff0c;构建树形结构&#xff0c;数据库一般就使用父id来表示&#xff0c;为了降低数据库的查询压力&#xff0c;我们可以使用Java8中的Stream流一次性把数据查出来&#xff0c;然后通过流式处理&#xff0c;我们一起来看看…

visual studio中如何指定查看WPF中某个窗口的运行效果

在 Visual Studio 中查看 WPF 窗口的运行效果通常意味着启动应用程序&#xff0c;并确保该窗口是应用程序启动时显示的第一个窗口。要做到这一点&#xff0c;您需要在应用程序的入口点&#xff08;通常是 App.xaml.cs&#xff09;指定要作为启动窗口的 WPF 窗口。 以下是如何指…

预编译仓库中的 Helm Chart

背景 内网部署项目, 没法直接hlem install , 需要提前看看有哪些镜像, 拉到本地看看 要使用预编译仓库中的 Helm Chart&#xff0c;你可以使用 helm fetch 命令来将 Chart 下载到本地&#xff0c;并使用 helm template 命令来预编译该 Chart。 首先&#xff0c;你可以使用以…

Cypress安装与使用教程(3)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

java 赋值运算符、自增自减运算符、关系运算符、逻辑运算符、三元运算符

一、赋值运算符 1.:把左边和右边的数据相加结果赋值给左边。 2.-把左边和右边相减赋值给左边。 3.*把左边和右边相乘赋值给左边。 4./把左边和右边相除赋值给左边。 5.%把左边和右边取余赋值给左边。 注意&#xff1a;扩展运算符包含了强制类型转换。 二、自增自减运算符…

SQL常见面试题

今天刷了一遍牛客里的必知必会题&#xff0c;一共50道题&#xff0c;大部分都比较基础&#xff0c;下面汇总一下易错题。 SQL81 顾客登录名 本题几个关键点&#xff1a; 登录名是其名称和所在城市的组合&#xff0c;因此需要使用substring()和concat()截取和拼接字段。得到登…

FL Studio 21最新版本for mac 21.2.2.3740中文解锁版2024最新图文安装教程

FL Studio 21最新版本for mac 21.2.0.3740中文解锁版是最新强大的音乐制作工具。它可以与所有类型的音乐一起创作出令人惊叹的音乐。它提供了一个非常简单且用户友好的集成开发环境&#xff08;IDE&#xff09;来工作。这个完整的音乐工作站是由比利时公司 Image-Line 开发的。…

若依生产环境中vue去除log

若依生产环境vue去除log 在main.js文件添加 // 测试环境 /dev-api 生产环境 /prod-api if (process.env.VUE_APP_BASE_API /prod-api) {//如果是生产环境 直接将log写没console.log () > {} }

模块测试:确保软件质量的关键步骤

引言&#xff1a; 在软件开发过程中&#xff0c;模块测试是确保软件质量的关键环节。通过模块化的设计和测试方法&#xff0c;可以提高开发效率、降低错误率&#xff0c;并最终提供稳定可靠的软件产品。本文将介绍模块测试的概念、重要性以及实施步骤&#xff0c;帮助读者了解如…

不知道怎么使用IDEA,一篇文章带你快速上手

前言 IDEA 是由 JetBrains 公司开发的软件产品&#xff0c;全称为 IntelliJ IDEA&#xff0c;一个 Java 语言的集成开发环境。它 —— 在业界被公认为是最好的 Java 开发工具之一&#xff0c;尤其在智能代码助手、代码自动提示、重构、J2EE 支持、Ant、JUnit、CVS 整合、代码审…

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现 之前&#xff0c;我们依据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;提出了新的YOLOV1架构&#xff0c;并解决前向推理过程中的两个问题&#xff0c;继续按照此书进行YOLOV1的复现。 经典目标…

5个用于构建Web应用程序的Go Web框架

探索高效Web开发的顶级Go框架 Go&#xff08;或称为Golang&#xff09;以其简洁性、高效性和出色的标准库而闻名。然而&#xff0c;有几个流行的Go Web框架和库为构建Web应用程序提供了额外的功能。以下是五个最值得注意的Go框架&#xff1a; 1. Gin&#xff1a; Gin是一个高…