标书制作收费标准/余姚seo智能优化

标书制作收费标准,余姚seo智能优化,邯郸疫情防控最新政策,做网站比较好的公司Hi,大家好,我是半亩花海。图卷积网络(Graph Convolutional Network, GCN)是一种处理图结构数据的深度学习模型。它通过聚合邻居节点的信息来更新每个节点的特征表示,广泛应用于社交网络分析、推荐系统和生物信息学等领…

Hi,大家好,我是半亩花海。图卷积网络(Graph Convolutional Network, GCN)是一种处理图结构数据的深度学习模型。它通过聚合邻居节点的信息来更新每个节点的特征表示,广泛应用于社交网络分析、推荐系统和生物信息学等领域。本实验通过实现一个简单的 GCN 层,展示了其核心思想,并通过具体代码示例说明了 GCN 层的工作原理。

目录

一、图卷积网络的含义

二、实验展示——基于PyTorch的图卷积网络(GCN)层实现

(一)实验目标

(二)实验方法

(三)实验结果分析

(四)思考与总结

三、完整代码

四、参考文章


一、图卷积网络的含义

说起图卷积神经网络(Graph Convolutional networks, GCN),可以先探讨一下卷积神经网络(CNN),CNN 中的卷积本质上就是利用共享参数的过滤器,通过计算中心像素点以及相邻像素点的加权和来实现空间特征的提取。而 GCN 也是如此,类似于图像中的卷积处理,它依赖于节点间的消息传递方法,这意味着节点与其邻居点交换信息,并相互发送消息。

在看具体的数学表达式之前,我们可以试着直观地理解 GCN 是如何工作的,可分为以下两大步骤:

  • 第一步:每个节点创建一个特征向量,表示它要发送给所有邻居的消息。
  • 第二步:消息被发送到相邻节点,这样每个节点均会从其相邻节点接收一条消息。

下面的图可视化了以上两大步骤:

那么随后该如何组合节点、接收消息呢?

由于节点间消息的数量不同,需要一个适用于任意数量的操作,通常的方法是求和或取平均值。令 H^{(l)} 表示节点 以前的特征表示,H^{(l+1)} 为整合消息后的特征表示,GCN 层定义如下:

H^{(l+1)}=\sigma\left(\hat{D}^{-1 / 2} \hat{A} \hat{D}^{-1 / 2} H^{(l)} W^{(l)}\right)

W^{(l)} 是将输入特征转换为消息的权重参数。在邻接矩阵 A 的基础上,加上单位矩阵,以便每个节点也向自身发送消息,即:\hat{A}=A+I。最后,为了取平均值的运算,需要用到矩阵 \hat{D},这是一个对角矩阵,D_{i} 表示节点 i 的邻居数。\sigma 表示一个任意的激活函数,当然,不一定是 Sigmoid,事实上,在 GNN 中通常使用基于 ReLU 的激活函数

二、实验展示——基于PyTorch的图卷积网络(GCN)层实现

(一)实验目标

  • 理解 GCN 层的基本原理
  • 实现一个简单的 GCN 层,并通过手动设置权重矩阵验证其计算过程
  • 分析输入节点特征与邻接矩阵如何影响输出特征

(二)实验方法

在 PyTorch 中实现 GCN 层时,我们可以灵活地利用张量进行运算,不必定义矩阵 \hat{D},只需将求和的消息除以之后的邻居数即可。此外,线性层便是以上的权重矩阵,同时可添加偏置(bias)。基于 PyTorch,定义GCN层的具体步骤如下所示。

1. 导入必要的库

import torch
import torch.nn as nn
  • torch:PyTorch 深度学习框架的核心库,用于张量操作和自动求导。
  • torch.nn:提供了构建神经网络所需的模块和函数。

2. 定义图卷积层(GCNLayer)

class GCNLayer(nn.Module):def __init__(self, c_in, c_out):"""Inputs::param c_in: 输入特征维度:param c_out: 输出特征维度"""super().__init__()self.projection = nn.Linear(c_in, c_out)  # 线性层
  • GCNLayer 继承自 nn.Module,是 PyTorch 中所有神经网络模块的基类。
  • c_inc_out 分别表示输入特征和输出特征的维度。
  • self.projection 是 PyTorch 中的线性变换层,将输入特征从 c_in 维映射到 c_out 维。其公式为:

output=input \cdot weight^{T}+bias

3. 前向传播

def forward(self, node_feats, adj_matrix):"""输入::param node_feats: 节点特征表示,大小为 [batch_size, num_nodes, c_in]:param adj_matrix: 邻接矩阵,大小为 [batch_size, num_nodes, num_nodes]:return: 更新后的节点特征"""num_neighbors = adj_matrix.sum(dim=-1, keepdims=True)  # 各节点的邻居数node_feats = self.projection(node_feats)  # 将特征转化为消息# 各邻居节点消息求和并求平均node_feats = torch.bmm(adj_matrix, node_feats)node_feats = node_feats / num_neighborsreturn node_feats
  • 输入参数:
    • node_feats:表示每个节点的特征,形状为 [batch_size, num_nodes, c_in]
    • adj_matrix:图的邻接矩阵,形状为 [batch_size, num_nodes, num_nodes]
  • 步骤解析:
    • 计算邻居数量:num_neighbors = adj_matrix.sum(dim=-1, keepdims=True) 计算每个节点的邻居数量(包括自身)。
    • 线性变换:node_feats = self.projection(node_feats) 对节点特征进行线性变换
    • 邻居信息聚合:torch.bmm(adj_matrix, node_feats) 使用批量矩阵乘法(Batch Matrix Multiplication)将邻居节点的消息加权求和
    • 归一化:node_feats = node_feats / num_neighbors 将聚合结果按邻居数量归一化,得到每个节点的更新特征。

4. 实验数据准备

node_feats = torch.arange(8, dtype=torch.float32).view(1, 4, 2)
adj_matrix = torch.Tensor([[[1, 1, 0, 0],[1, 1, 1, 1],[0, 1, 1, 1],[0, 1, 1, 1]]])
print("节点特征:\n", node_feats)
print("添加自连接的邻接矩阵:\n", adj_matrix)

(1)节点特征

  • node_feats 是一个形状为 [1, 4, 2] 的张量,表示一个批次中 4 个节点的特征,每个节点有 2 维特征。
节点特征:tensor([[[0., 1.],[2., 3.],[4., 5.],[6., 7.]]])

(2)邻接矩阵

  • adj_matrix 是一个形状为 [1, 4, 4] 的张量,表示图的邻接矩阵。
添加自连接的邻接矩阵:tensor([[[1., 1., 0., 0.],[1., 1., 1., 1.],[0., 1., 1., 1.],[0., 1., 1., 1.]]])
  • 邻接矩阵中的元素为 1 表示两个节点之间存在连接,0 表示无连接。

5. 初始化GCN层并设置权重

layer = GCNLayer(c_in=2, c_out=2)
# 初始化权重矩阵
layer.projection.weight.data = torch.Tensor([[1., 0.], [0., 1.]])
layer.projection.bias.data = torch.Tensor([0., 0.])
  • 创建一个 GCNLayer 实例,输入特征维度为 2,输出特征维度也为 2。
  • 手动初始化权重矩阵和偏置(bia):
    • 权重矩阵为单位矩阵,表示不改变输入特征:(该单位矩阵的值 I = 1
    • 偏置为零向量

由于权重矩阵是单位矩阵,偏置为零,线性变换的公式简化为:

output=input \cdot weight^{T}+bias=input \cdot I+0=input

因此,线性变换后的节点特征与输入特征相同

6. 前向传播并计算输出特征

# 将节点特征和添加自连接的邻接矩阵输入 GCN 层
with torch.no_grad():out_feats = layer(node_feats, adj_matrix)print("节点输出特征:\n", out_feats)
  • 使用 torch.no_grad() 关闭梯度计算,避免不必要的内存开销。
  • 调用 layer(node_feats, adj_matrix) 进行前向传播,得到更新后的节点特征。
  • 输出结果:
节点输出特征:tensor([[[1., 2.],[3., 4.],[4., 5.],[4., 5.]]])

(三)实验结果分析

1. 输入数据

(1)节点特征

节点特征是一个大小为 [1, 4, 2] 的张量,表示一个批次中有 4 个节点,每个节点有 2 维特征。具体值如下:

tensor([[[0., 1.],[2., 3.],[4., 5.],[6., 7.]]])
  • 节点 0 的特征为:[0., 1.]
  • 节点 1 的特征为:[2., 3.]
  • 节点 2 的特征为:[4., 5.]
  • 节点 3 的特征为:[6., 7.]

(2)邻接矩阵

邻接矩阵是一个大小为 [1, 4, 4] 的张量,表示 4 个节点之间的连接关系。具体值如下:

tensor([[[1., 1., 0., 0.],[1., 1., 1., 1.],[0., 1., 1., 1.],[0., 1., 1., 1.]]])
  • 节点 0 的邻居为:节点 0 和节点 1。
  • 节点 1 的邻居为:节点 0、节点 1、节点 2 和节点 3。
  • 节点 2 的邻居为:节点 1、节点 2 和节点 3。
  • 节点 3 的邻居为:节点 1、节点 2 和节点 3。

如何通过邻接矩阵来判断每个节点的邻居是什么?——看值为1的索引是多少,那么邻居便是多少。

[[1., 1., 0., 0.],  # 节点0的邻居:值为1的列索引为[0, 1],即节点0和节点1。[1., 1., 1., 1.],  # 节点1的邻居:值为1的列索引为[0, 1, 2, 3],即节点0、节点1、节点2和节点3。[0., 1., 1., 1.],  # 节点2的邻居:值为1的列索引为[1, 2, 3],即节点1、节点2和节点3。[0., 1., 1., 1.]]  # 节点3的邻居:值为1的列索引为[1, 2, 3],即节点1、节点2和节点3。

本实验中的图 G 的图示如下:

2. 输出特征分析

经GCN层的前向传播后,得到输出特征,其形状为 [1, 4, 2] 的张量,表示更新后的节点特征。

tensor([[[1., 2.],[3., 4.],[4., 5.],[4., 5.]]])

GCN 层通过邻接矩阵聚合邻居节点的消息。具体计算如下:对于每个节点,将其邻居节点的特征相加。再将聚合后的特征除以邻居数量,得到平均特征,即最终的输出特征。下面逐节点分析输出特征的计算过程:

(1)节点0的计算
  • 邻居节点:节点0和节点1。
  • 聚合特征:[0., 1.] + [2., 3.] = [2., 4.]
  • 邻居数量:2
  • 平均特征:[2., 4.] / 2 = [1., 2.]
(2)节点1的计算
  • 邻居节点:节点0、节点1、节点2和节点3。
  • 聚合特征:[0., 1.] + [2., 3.] + [4., 5.] + [6., 7.] = [12., 16.]
  • 邻居数量:4
  • 平均特征:[12., 16.] / 4 = [3., 4.]
(3)节点2的计算
  • 邻居节点:节点1、节点2和节点3。
  • 聚合特征:[2., 3.] + [4., 5.] + [6., 7.] = [12., 15.]
  • 邻居数量:3
  • 平均特征:[12., 15.] / 3 = [4., 5.]
(4)节点3的计算
  • 邻居节点:节点1、节点2和节点3。
  • 聚合特征:[2., 3.] + [4., 5.] + [6., 7.] = [12., 15.]
  • 邻居数量:3
  • 平均特征:[12., 15.] / 3 = [4., 5.]

通过上述分析可以看出,GCN 层的核心思想是通过聚合邻居节点的信息来更新每个节点的特征表示。具体来说:

  • 线性变换 :首先对输入特征进行线性变换(本实验中权重矩阵为单位矩阵,因此特征未发生变化)。
  • 邻居信息聚合 :通过邻接矩阵将邻居节点的特征加权求和。
  • 归一化 :将聚合结果按邻居数量归一化,得到最终的节点特征。

(四)思考与总结

1. 思考

如上所见,第一个节点的输出值是其自身和第二个节点的平均值,其他节点同理。当然,在具体实践中,我们还希望允许节点之间的消息传递不仅仅局限于邻居节点,还可以通过应用多个 GCN 层来实现,而很多的 GNN 即是由多个 GCN 和非线性(如 ReLU)的组合构建而成,如下图所示:

通过以上 GCN 层的运算示例,发现一个问题,即节点 3 和 4 的输出相同,这是因为它们具有相同的相邻节点(包括自身)输入,再取均值,所得到的值便一样了。这在大部分情况下并不合理。

2. 总结

本实验通过实现一个简单的 GCN 层,展示了图卷积网络的核心思想——通过聚合邻居节点的信息来更新节点特征。通过手动设置权重矩阵和偏置,我们验证了 GCN 层的计算过程,并分析了输入特征与邻接矩阵对输出特征的影响。实验结果表明,GCN 层能够有效地捕捉图结构中的局部信息。

未来可以进一步扩展该实验:

  • 引入非线性激活函数 :在 GCN 层中加入 ReLU 等非线性激活函数,增强模型的表达能力。
  • 多层 GCN :堆叠多个 GCN 层,以捕获更高阶的邻居信息。
  • 真实数据集实验 :在实际图数据集(如 Cora 或 Citeseer)上测试 GCN 模型的性能。
  • 优化算法 :结合梯度下降等优化算法,训练 GCN 模型以完成特定任务(如节点分类或链接预测)。

通过这些扩展,可以更全面地理解图卷积网络的工作原理及其在实际问题中的应用价值。


三、完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : GNN/GCN
@File    : gcn1.py
@IDE     : PyCharm
@Author  : 半亩花海
@Date    : 2025/02/28 21:33
"""
import torch
import torch.nn as nnclass GCNLayer(nn.Module):def __init__(self, c_in, c_out):"""Inputs::param c_in: 输入特征:param c_out: 输出特征"""super().__init__()self.projection = nn.Linear(c_in, c_out);  # 线性层def forward(self, node_feats, adj_matrix):"""输入:param node_feats: 节点特征表示,大小为[batch_size,num_nodes,c_in]:param adj_matrix: 邻接矩阵:[batch_size,num_nodes,num_nodes]:return:"""num_neighbors = adj_matrix.sum(dim=-1, keepdims=True)  # 各节点的邻居数node_feats = self.projection(node_feats)  # 将特征转化为消息# 各邻居节点消息求和并求平均node_feats = torch.bmm(adj_matrix, node_feats)node_feats = node_feats / num_neighborsreturn node_featsnode_feats = torch.arange(8, dtype=torch.float32).view(1, 4, 2)
adj_matrix = torch.Tensor([[[1, 1, 0, 0],[1, 1, 1, 1],[0, 1, 1, 1],[0, 1, 1, 1]]])
print("节点特征:\n", node_feats)
print("添加自连接的邻接矩阵:\n", adj_matrix)layer = GCNLayer(c_in=2, c_out=2)
# 初始化权重矩阵
layer.projection.weight.data = torch.Tensor([[1., 0.], [0., 1.]])
layer.projection.bias.data = torch.Tensor([0., 0.])# 将节点特征和添加自连接的邻接矩阵输入 GCN 层
with torch.no_grad():out_feats = layer(node_feats, adj_matrix)print("节点输出特征:\n", out_feats)

四、参考文章

[1] 实战-----基于 PyTorch 的 GNN 搭建_pytorch gnn-CSDN博客

[2] 图神经网络简单理解 — — 附带案例_图神经网络实例-CSDN博客

[3] 一文快速预览经典深度学习模型(二)——迁移学习、半监督学习、图神经网络(GNN)、联邦学习_迁移学习 图神经网络-CSDN博客

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

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

相关文章

集合遍历的多种方式

目录 1.增强for 2.迭代器(在遍历的过程中需要删除元素,请使用迭代器) 3.双列集合 4.Lambda表达式(forEach方法) 1.单列集合: 2.双列集合: 4.Stream 流 5.普通for循环 6.列表迭代器 7.总结 1.增强for 注&…

value_counts()和unique()

我今天发现一个很有意思的问题哈 import scanpy as sc import numpy as npX np.random.randn(10,3) adata1 sc.AnnData(X) adata1.obs["sample"] "H1" print(adata1)X np.random.randn(20,3) adata2 sc.AnnData(X) adata2.obs["sample"] &…

每日OJ_牛客_游游的字母串_枚举_C++_Java

目录 牛客_游游的字母串_枚举 题目解析 C代码 Java代码 牛客_游游的字母串_枚举 游游的字母串 描述: 对于一个小写字母而言,游游可以通过一次操作把这个字母变成相邻的字母。a和b相邻,b和c相邻,以此类推。特殊的&#xff0…

数字万用表的使用教程

福禄克经济型数字万用表前面板按键功能介绍示意图 1. 万用表简单介绍 万用表是一种带有整流器的、可以测量交、直流电流、电压及电阻等多种电学参量的磁电式仪表。分为数字万用表,钳形万用表, (1)表笔分为红、黑二只。使用时黑色…

DeepSeek使用手册分享-附PDF下载连接

本次主要分享DeepSeek从技术原理到使用技巧内容,这里展示一些基本内容,后面附上详细PDF下载链接。 DeepSeek基本介绍 DeepSeek公司和模型的基本简介,以及DeepSeek高性能低成本获得业界的高度认可的原因。 DeepSeek技术路线解析 DeepSeek V3…

Hugging Face 推出 FastRTC:实时语音视频应用开发变得得心应手

估值超过 40 亿美元的 AI 初创公司 Hugging Face 推出了 FastRTC,这是一个开源 Python 库,旨在消除开发者在构建实时音频和视频 AI 应用时的主要障碍。 "在 Python 中正确构建实时 WebRTC 和 Websocket 应用一直都很困难,"FastRTC…

Qt显示一个hello world

一、显示思路 思路一:通过图形化方式,界面上创建出一个控件显示。 思路二:通过编写C代码在界面上创建控件显示。 二、思路一实现 点开 Froms 的 widget.ui,拖拽 label 控件,显示 hello world 即可。 qmake 基于 .…

复合机器人为 CNC 毛坯件上下料注入 “智能强心针”

在竞争日益激烈的 CNC 加工行业,如何提升生产效率、保证产品质量、实现智能化生产成为众多企业亟待解决的问题。富唯智能凭借其先进的复合机器人技术,成功为多家 CNC 加工企业提供了毛坯件上下料的优质解决方案,有效提升了生产效能&#xff0…

Spring Cloud Gateway 网关的使用

在之前的学习中,所有的微服务接口都是对外开放的,这就意味着用户可以直接访问,为了保证对外服务的安全性,服务端实现的微服务接口都带有一定的权限校验机制,但是由于使用了微服务,就需要每一个服务都进行一…

webstorm的Live Edit插件配合chrome扩展程序JetBrains IDE Support实现实时预览html效果

前言 我们平时在前端网页修改好代码要点击刷新再去看修改的效果,这样比较麻烦,那么很多软件都提供了实时预览的功能,我们一边编辑代码一边可以看到效果。下面说的是webstorm。 1 Live Edit 首先我们需要在webstorm的settings里安装插件Live …

map的operator[]的实现

map的operator[]的实现 operator[]里包含插入操作,所以我们先看一下首先看一下map的insert函数 返回值是一个pair类型。正常的常见的insert,插入成功返回true,失败返回false 这里设计的insert不单单返回布尔值,而是返回一个pair…

定时器的编码器接口模式

选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS001,如果只在TI1边沿计数,则置SMS010,如果计数器同时在TI1和TI2边沿计数,则置SMS 011 明确一点,计数器…

突破光学成像局限:全视野光学血管造影技术新进展

全视野光学血管造影(FFOA)作为一种实时、无创的成像技术,能够提取生物血液微循环信息,为深入探究生物组织的功能和病理变化提供关键数据。然而,传统FFOA成像方法受到光学镜头景深(DOF)的限制&am…

OpenHarmony 进阶——HDF 驱动框架的原理小结

文章大纲 引言一、HDF的驱动加载(驱动安装)方式1、动态加载(主要是uhdf)2、静态加载(主要是khdf)2.1、驱动入口实现2.1.1、Bind接口2.1.2、Init接口2.1.3、Release接口 2.2、HDF_INIT 驱动入口符号2.3、获取驱动列表2.4、获取设备…

Redis - 高可用实现方案解析:主从复制与哨兵监控

文章目录 Pre概述Redis 高可用实现方案一、主从复制机制1.1 全量同步流程1.2 增量同步(PSYNC)流程 二、哨兵监控机制2.1 故障转移时序流程 三、方案对比与选型建议四、生产环境实践建议 Pre Redis-入门到精通 Redis进阶系列 Redis进阶 - Redis主从工作…

2025年渗透测试面试题总结-02(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 阿里云安全实习 一、代码审计经验与思路 二、越权漏洞原理与审计要点 三、SSRF漏洞解析与防御 四、教…

水滴tabbar canvas实现思路

废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…

解决各大浏览器中http地址无权限调用麦克风摄像头问题(包括谷歌,Edge,360,火狐)后续会陆续补充

项目场景: 在各大浏览器中http地址调用电脑麦克风摄像头会没有权限,http协议无法使用多媒体设备 原因分析: 为了用户的隐私安全,http协议无法使用多媒体设备。因为像摄像头和麦克风属于可能涉及重大隐私问题的API,ge…

网络安全蜜罐产品研究现状

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 一、知识点总结 1、蜜罐(Honeypot):诱捕攻击者的一个陷阱。 2、蜜网(Honeynet):采用了技术…

el-card 结合 el-descriptions 作为信息展示

记录下el-card 组合 el-descriptions 实现动态展示信息 文章结构 实现效果1. el-descriptions 组件使用1.1 结合v-for实现列表渲染1.2 解析 2. 自定义 el-descriptions 样式2.1 修改背景色、字体颜色2.2 调整字体大小2.3 解析 3. el-card 结合 el-descriptions 作为信息展示3.…