GCN原理回顾论文导读

Cora_dataset description

Cora数据集是一个常用的学术文献用网络数据集,用于研究学术文献分类和图网络分析等任务。
该数据集由机器学习领域的博士论文摘要组成,共计2708篇论文,涵盖了7个不同的学科领域。每篇论文都有一个唯一的ID,并且被分为以下7个类别之一:Case_Based、Genetic_Algorithms、Neural_Networks、Probabilistic_Methods、Reinforcement_Learning、Rule_Learning和Theory。

除了论文之间的引用关系外,Cora数据集还包含了每篇论文的词袋表示,即将每篇论文表示为一个词频向量(0-1嵌入,每行有多个1,非one-hot vector,feature of node)。这些词频向量表示了论文中出现的单词及其在该论文中的出现频率。

Cora数据集常用于图神经网络的研究和评估,可以用于学术文献分类、引文网络分析、节点嵌入等任务。

print cora

dataset = Planetoid("./tmp/Cora", name="Cora", transform=T.NormalizeFeatures())
num_nodes = dataset.data.num_nodes
# For num. edges see:
# - https://github.com/pyg-team/pytorch_geometric/issues/343
# - https://github.com/pyg-team/pytorch_geometric/issues/852num_edges = dataset.data.num_edges // 2
train_len = dataset[0].train_mask.sum()
val_len = dataset[0].val_mask.sum()
test_len = dataset[0].test_mask.sum()
other_len = num_nodes - train_len - val_len - test_len
print(f"Dataset: {dataset.name}")
print(f"Num. nodes: {num_nodes} (train={train_len}, val={val_len}, test={test_len}, other={other_len})")
print(f"Num. edges: {num_edges}")
print(f"Num. node features: {dataset.num_node_features}")
print(f"Num. classes: {dataset.num_classes}")
print(f"Dataset len.: {dataset.len()}")

在这里插入图片描述

GCN原理与实现

卷积公式: f ∗ g = F − 1 ( F ( f ) ⋅ F ( g ) ) f*g=F^{-1}(F(f)·F(g)) fg=F1(F(f)F(g))
给定一个图信号x和一个卷积核, x ∗ g = U ( U T x ⊙ U T g ) = U ( U T x ⊙ g θ ) = D ~ − 0.5 A ~ D ~ − 0.5 X Θ x*g=U(U^Tx\odot U^Tg)=U(U^Tx\odot g_{\theta})=\widetilde D^{-0.5}\widetilde A\widetilde D^{-0.5}X\Theta xg=U(UTxUTg)=U(UTxgθ)=D 0.5A D 0.5XΘ
其中A为图的邻接矩阵,D为图的度数矩阵,
D ~ = D + γ I , A ~ = A + γ I \widetilde D=D+\gamma I,\widetilde A=A+\gamma I D =D+γI,A =A+γI,添加自环以缩小 λ \lambda λ(Laplace matrix)

1.computation of D ~ − 0.5 A ~ D ~ − 0.5 \widetilde D^{-0.5}\widetilde A\widetilde D^{-0.5} D 0.5A D 0.5

def gcn_norm(edge_index, edge_weight=None, num_nodes=None,
add_self_loops=True, flow="source_to_target", dtype=None):
fill_value = 1.
num_nodes = maybe_num_nodes(edge_index, num_nodes)
if add_self_loops: #添加自环
edge_index, edge_weight = add_remaining_self_loops(
edge_index, edge_weight, fill_value, num_nodes)
edge_weight = torch.ones((edge_index.size(1), ), dtype=dtype,
device=edge_index.device)
row, col = edge_index[0], edge_index[1]
idx = col
deg = scatter(edge_weight, idx, dim=0, dim_size=num_nodes, reduce='sum')
deg_inv_sqrt = deg.pow_(-0.5)
deg_inv_sqrt.masked_fill_(deg_inv_sqrt == float('inf'), 0)
edge_weight = deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col]
return edge_index, edge_weight

代码解释

edge_index, edge_weight = add_remaining_self_loops(edge_index, edge_weight,fill_value, num_nodes)
D ~ = D + γ I , A ~ = A + γ I \widetilde D=D+\gamma I,\widetilde A=A+\gamma I D =D+γI,A =A+γI;
deg = scatter(edge_weight, idx, dim=0, dim_size=num_nodes, reduce='sum')
根据edge_weight和idx=edge_index[1]得到度数矩阵,deg=D

  • explantation:edge_weight是要放入的对角阵,

deg_inv_sqrt = deg.pow_(-0.5):require D − 0.5 D^{-0.5} D0.5
deg_inv_sqrt.masked_fill_(deg_inv_sqrt == float('inf'), 0)
由于D非对角元=0,其-0.5次幂=∞,需要转化为0,
edge_weight = deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col]
输出归一化后的edge_index

2. PairNorm

在这里插入图片描述

3.GCNConv的实现如下(删改自torch_geometric.nn.GCNConv)

class myGCNConv2(MessagePassing):def __init__(self, in_channels: int, out_channels: int,add_self_loops: bool = True,bias: bool = True):super().__init__()self.in_channels = in_channelsself.out_channels = out_channelsself.add_self_loops = add_self_loopsself.lin = Linear(in_channels, out_channels, bias=False,weight_initializer='glorot')if bias:self.bias = Parameter(torch.Tensor(out_channels))else:self.register_parameter('bias', None)self.reset_parameters()def reset_parameters(self):super().reset_parameters()self.lin.reset_parameters()         #卷积层zeros(self.bias)                    #偏置层def forward(self, x: Tensor, edge_index: Adj,edge_weight: OptTensor = None) -> Tensor:edge_index, edge_weight = gcn_norm(  # yapf: disableedge_index, edge_weight, x.size(self.node_dim),self.add_self_loops, self.flow, x.dtype)x = self.lin(x)# propagate_type: (x: Tensor, edge_weight: OptTensor)out = self.propagate(edge_index, x=x, edge_weight=edge_weight,size=None)if self.bias is not None:out = out + self.biasreturn outdef message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor:return x_j if edge_weight is None else edge_weight.view(-1, 1) * x_jdef message_and_aggregate(self, adj_t: SparseTensor, x: Tensor) -> Tensor:return spmm(adj_t, x, reduce=self.aggr)

代码解释

x = self.lin(x) X ′ = X Θ , X ∈ R n ∗ d 1 , Θ ∈ R d 1 ∗ d 2 X'=X\Theta,X\in R^{n*d1},\Theta \in R^{d1*d2} X=XΘXRnd1ΘRd1d2,对X降维
out = self.propagate(edge_index, x=x, edge_weight=edge_weight,size=None)
out= A ′ X ′ = D ~ − 1 2 A ~ D ~ − 1 2 X Θ A'X'=\widetilde D^{-\frac 1 2}\widetilde A \widetilde D^{-\frac 1 2 } X \Theta AX=D 21A D 21XΘ
Converge {x1’,…,xn’} ,each of which be a sampled vector,into target form.

message&message_and_aggregate为MessagePassing.propagate的相关函数,
经测试,删除后,val acc下降,故予以保留

4.Net(GCN)的实现

class GCN(torch.nn.Module):
def __init__(
self,
num_node_features: int,
num_classes: int,
hidden_dim: int = 16,
dropout_rate: float = 0.5,
) -> None:
super().__init__()
self.dropout1 = torch.nn.Dropout(dropout_rate)
self.conv1 = myGCNConv2(num_node_features,
hidden_dim,add_self_loops=True)
self.relu = torch.nn.ReLU(inplace=True)
self.dropout2 = torch.nn.Dropout(dropout_rate)
self.conv2 = myGCNConv2(hidden_dim, num_classes,add_self_loops=True)
self.pn=PairNorm()
def forward(self, x: Tensor, edge_index: Tensor) -> torch.Tensor:
x = self.pn(x)
x = self.dropout1(x)
x = self.conv1(x, edge_index)
x = self.relu(x)
x = self.dropout2(x)
x = self.conv2(x, edge_index)
return x

代码解释

x = self.pn(x):对x作PairNorm处理,之后xi~N(0,s2),各节点特征范数大小平衡,作用不明显;
采用2层GCN卷积层,中间用relu激活,dropout避免过拟合

DropEdge Realization的手动实现

  • idea
  1. 首先把有向图的边,转化为无向图的边,保存在single_edge_index中,实现时先用single_edge字
    典存储每条无向边(key-value 任意)1次,再把single_edge转化成无向图的边集索引(2-dim tensor
    array)
#single_edge_index
single_edge={}
for i in range(len(dataset.data.edge_index[0])):if(((dataset.data.edge_index[0][i],dataset.data.edge_index[1][i]) not in single_edge.items()) and ((dataset.data.edge_index[1][i],dataset.data.edge_index[0][i]) not in single_edge.items())):single_edge[dataset.data.edge_index[0][i]]=dataset.data.edge_index[1][i]single_edge_index=[[],[]]for key,value in single_edge.items():single_edge_index[0].append(key)single_edge_index[1].append(value)        single_edge_index=torch.tensor(single_edge_index)
  1. 再把无向边集舍去dropout_rate比例的部分,之后转成有向边集索引
def drop_edge(single_edge_index, dropout_rate):# 计算需要丢弃的边数num_edges = single_edge_index.shape[1]num_drop = int(num_edges * dropout_rate)# 随机选择要丢弃的边remain_indices = torch.randperm(num_edges)[num_drop:]remain_single_edges = single_edge_index[:, remain_indices]reverse_edges = torch.stack([remain_single_edges[1],remain_single_edges[0]],dim=0)remain_edges=torch.cat([remain_single_edges,reverse_edges],dim=1)return remain_edges

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

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

相关文章

李沐动手学习深度学习——3.5练习

减少batch_size(如减少到1)是否会影响读取性能? 肯定会影响,计算机io性能而言,随着batch_size增大,读取越来越快,需要的时间越少。这里会涉及到计算机操作系统的知识点,内存与硬盘之…

AmzTrends x TiDB Serverless:通过云原生改造实现全局成本降低 80%

本文介绍了厦门笛卡尔数据(AmzTrends)在面临数据存储挑战时,选择将其数据分析服务迁移到 TiDB Serverless 的思路和实践。通过全托管的数据库服务,AmzTrends 实现了全局成本降低 80% 的效果,同时也充分展示了 TiDB Ser…

kafka进阶(二)

文章目录 前言一、Ack机制二、ISR集合总结 前言 本篇主要介绍kafka 的 Ack机制 和 ISR集合 一、Ack机制 Kafka提供了三种不同的应答机制(ACK): acks0:这是最不可靠的模式。在这种模式下,生产者不会等待来自服务器的…

三、软考-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。 冯诺依曼体系计算机结构: 1、计算机硬件组成 冯诺依曼计算机结构将…

正向代理的反爬虫与防DDoS攻击:保护网站免受恶意行为

目录 前言 一、正向代理的原理 二、正向代理的反爬虫功能 1. IP地址隐藏 2. 请求多样化 三、正向代理的防DDoS攻击功能 1. 均衡负载 2. IP过滤 结论 前言 在当前互联网环境下,网站常常受到各种恶意行为的侵袭,其中包括爬虫和DDoS攻击。这些行为…

#WEB前端(DIV、SPAN)

1.实验&#xff1a;DIV、SPAN 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 类? 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdev…

数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?-OceanBase案例

毫末智行是一家致力于自动驾驶的人工智能技术公司&#xff0c;其前身是长城汽车智能驾驶前瞻分部&#xff0c;以零事故、零拥堵、自由出行和高效物流为目标&#xff0c;助力合作伙伴重塑和全面升级整个社会的出行及物流方式。 在自动驾驶领域中&#xff0c;是什么原因让毫末智行…

Linux——基本指令

系列文章目录 文章目录 系列文章目录一、Linux基本常识二、Linux基本指令2.1 mkdir指令&#xff08;重要&#xff09;2.2 rmdir指令2.3 rm指令&#xff08;重要&#xff09;2.4 touch指令2.5 ls指令2.6 pwd指令2.7 cd指令2.7.1 Linux中的目录结构2.7.2 绝对路径和相对路径2.7.3…

对程序、进程、线程、并发、并行、高并发概念的讲解

一、概述 程序、进程、线程、并发、并行和高并发是计算机科学领域中非常重要的概念。 了解进程、线程、并发和并行的概念&#xff0c;可以更好地利用计算机的多核处理器和并行计算能力&#xff0c;提高计算机性能。 了解进程和线程为操作系统中的资源管理提供了基础&#xff…

【风格迁移】对比度保持连贯性损失 CCPL:解决图像局部失真、视频帧间的连贯性和闪烁

对比度保持连贯性损失 CCPL&#xff1a;解决图像局部失真、视频帧间的连贯性和闪烁 提出背景解法&#xff1a;对比度保持连贯性损失&#xff08;CCPL&#xff09; 局部一致性假设 对比学习机制 邻域调节策略 互信息最大化对比学习&#xff1a;在无需标签的情况下有效学习区分…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的教室人员检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发教室人员检测与计数系统对于优化教学资源和提升教学效率具有重要意义。本篇博客详细介绍了如何利用深度学习构建此系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5的性能&#xff0c;展示…

[vue error] TypeError: AutoImportis not a function

问题详情 问题描述: element plus按需导入后&#xff0c;启动项目报错&#xff1a; 问题解决 将unplugin-auto-import 回退到0.16.1 npm install unplugin-auto-import0.16.1 安装完后再次运行就好了

差分题练习(区间更新)

一、差分的特点和原理 对于一个数组a[]&#xff0c;差分数组diff[]的定义是: 对差分数组做前缀和可以还原为原数组: 利用差分数组可以实现快速的区间修改&#xff0c;下面是将区间[l, r]都加上x的方法: diff[l] x; diff[r 1] - x;在修改完成后&#xff0c;需要做前缀和恢复…

PYTHON 自动化办公:压缩图片(PIL)

1、介绍 在办公还是学习过程中&#xff0c;难免会遇到上传照片的问题。然而照片的大小限制一直都是个问题&#xff0c;例如照片限制在200Kb之内&#xff0c;虽然有很多图像压缩技术可以实现&#xff0c;但从图像处理的专业来说&#xff0c;可以利用代码实现 这里使用的库函数是…

观成科技:加密C2框架Covenant流量分析

工具介绍 Covenant是一个基于.NET的开源C2服务器&#xff0c;可以通过HTTP/HTTPS 控制Covenant agent&#xff0c;从而实现对目标的远程控制。Covenant agent在与C2通信时&#xff0c;使用base64/AES加密载荷的HTTP隧道构建加密通道。亦可选择使用SSL/TLS标准加密协议&#xf…

Java网络通信TCP

目录 TCP两个核心类 服务端 1.用ServerSocker类创建对象并且手动指定端口号 2.accept阻塞连接服务端与客户端 3.给客户端提供处理业务方法 4.处理业务 整体代码 客户端 1.创建Socket对象&#xff0c;并连接服务端的ip与端口号 2.获取Socket流对象&#xff0c;写入数据…

Linux: Network: socket: sendto 如果返回0,是否一定代表发送成功?

最近遇到一个问题&#xff0c;虽然应用层使用的系统调用send已经返回成功&#xff0c;而且没有错误日志产生&#xff0c;也没有errno的设置。那是不是代表一定是没有问题&#xff1f;从抓包的结果看&#xff0c;虽然上层应用已经显示发出去&#xff0c;但是实际抓包的时候&…

被曝隐瞒添加剂、夸大产品功效,东方甄选再陷选品风波

号称专注为客户细心甄选好物的东方甄选&#xff08;&#xff08;HK:01797&#xff09;&#xff09;&#xff0c;又摊上事儿了。 近日&#xff0c;海关总署发布公告称&#xff0c;美国饮料生产企业JERRY&SONS PHARMACEUTICAL INC在申请注册时提供了虚假材料&#xff0c;且未…

C2_W2_Assignment_吴恩达_中英_Pytorch

Neural Networks for Handwritten Digit Recognition, Multiclass In this exercise, you will use a neural network to recognize the hand-written digits 0-9. 在本次练习中&#xff0c;您将使用神经网络来识别0-9的手写数字。 Outline 1 - Packages 2 - ReLU Activatio…