论文阅读和分析:《DeepGCNs: Can GCNs Go as Deep as CNNs?》

article/2025/10/2 6:40:48

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。


数据集
1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED
相关论文阅读分析:
1、EEG-SEED数据集作者的—基线论文阅读和分析
2、图神经网络EEG论文阅读和分析:《EEG-Based Emotion Recognition Using Regularized Graph Neural Networks》
3、EEG-GNN论文阅读和分析:《EEG Emotion Recognition Using Dynamical Graph Convolutional Neural Networks》
4、论文阅读和分析:Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification
5、论文阅读和分析:《DeepGCNs: Can GCNs Go as Deep as CNNs?》
6、论文阅读和分析: “How Attentive are Graph Attention Networks?”
7、论文阅读和分析:Simplifying Graph Convolutional Networks

8、论文阅读和分析:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation
9、图神经网络汇总和总结
相关实验和代码实现:
1、用于图神经网络的脑电数据处理实现_图神经网络 脑电
2、使用GCN训练和测试EEG的公开SEED数据集
3、使用GAT训练和测试EEG公开的SEED数据集
4、使用SGC训练和测试SEED数据集
5、使用Transformer训练和测试EEG的公开SEED数据集_eeg transformer
6、使用RGNN训练和测试EEG公开的SEED数据集
辅助学习资料:
1、官网三个简单Graph示例说明三种层次的应用_graph 简单示例
2、PPI数据集示例项目学习图神经网络
3、geometric库的数据处理详解
4、NetworkX的dicts of dicts以及解决Seven Bridges of Königsberg问题
5、geometric源码阅读和分析:MessagePassin类详解和使用
6、cora数据集示例项目学习图神经网络
7、Graph 聚合
8、QM9数据集示例项目学习图神经网络
9、处理图的开源库

更深的图卷积神经网络,相当于residual在CNN中的应用,使得可以构建更深层次的卷积网络而不会造成梯度消失无法训练的问题。

算法原理:

学习过Resnet去理解DeepGCNs就会很容易,看图片基本就能明白。

提出了用于点云语义分割的GCN架构。(左)我们的框架由三个块组成:GCN骨干块(输入点云的特征转换)、融合块(全局特征生成和融合)和MLP预测块(逐点标签预测)。(右)我们研究了三种类型的GCN骨干块(PlainGCN、ResGCN和DenseGCN),并使用了两种层连接(ResGCN中使用的逐顶点加法或DenseGCN中使用的按顶点级联)。

在这里插入图片描述

geometric的实现

torch_geometric.nn — pytorch_geometric documentation (pytorch-geometric.readthedocs.io)

The implemented skip connections includes the pre-activation residual connection ("res+"), the residual connection ("res"), the dense connection ("dense") and no connections ("plain").

  • Res+ ("res+"):

Normalization → Activation → Dropout → GraphConv → Res \text{Normalization}\to\text{Activation}\to\text{Dropout}\to \text{GraphConv}\to\text{Res} NormalizationActivationDropoutGraphConvRes

  • Res (:obj:"res") / Dense (:obj:"dense") / Plain(:obj:"plain"):

GraphConv → Normalization → Activation → Res/Dense/Plain → Dropout \text{GraphConv}\to\text{Normalization}\to\text{Activation}\to \text{Res/Dense/Plain}\to\text{Dropout} GraphConvNormalizationActivationRes/Dense/PlainDropout

geometric库的实现两种相关架构的网络单元,Res+和Res,需要输入卷积、激活和归一化等子单元,就是说可以用户定制化的实现,这一点很值得学习。一种延迟策略,实现良好的泛化性。

from typing import Optionalimport torch
import torch.nn.functional as F
from torch import Tensor
from torch.nn import Module
from torch.utils.checkpoint import checkpointclass DeepGCNLayer(torch.nn.Module):"""Args:conv (torch.nn.Module, optional): the GCN operator.(default: :obj:`None`)norm (torch.nn.Module): the normalization layer. (default: :obj:`None`)act (torch.nn.Module): the activation layer. (default: :obj:`None`)block (string, optional): The skip connection operation to use(:obj:`"res+"`, :obj:`"res"`, :obj:`"dense"` or :obj:`"plain"`).(default: :obj:`"res+"`)dropout (float, optional): Whether to apply or dropout.(default: :obj:`0.`)ckpt_grad (bool, optional): If set to :obj:`True`, will checkpoint thispart of the model. Checkpointing works by trading compute formemory, since intermediate activations do not need to be kept inmemory. Set this to :obj:`True` in case you encounter out-of-memoryerrors while going deep. (default: :obj:`False`)"""def __init__(self,conv: Optional[Module] = None,norm: Optional[Module] = None,act: Optional[Module] = None,block: str = 'res+',dropout: float = 0.,ckpt_grad: bool = False,):super().__init__()self.conv = convself.norm = normself.act = actself.block = block.lower()assert self.block in ['res+', 'res', 'dense', 'plain']self.dropout = dropoutself.ckpt_grad = ckpt_graddef reset_parameters(self):self.conv.reset_parameters()self.norm.reset_parameters()def forward(self, *args, **kwargs) -> Tensor:""""""args = list(args)x = args.pop(0)if self.block == 'res+':h = xif self.norm is not None:h = self.norm(h)if self.act is not None:h = self.act(h)h = F.dropout(h, p=self.dropout, training=self.training)if self.conv is not None and self.ckpt_grad and h.requires_grad:# checkpoint不保存中间变量,而是在后向更新的时候重新计算一遍。h = checkpoint(self.conv, h, *args, **kwargs)else:h = self.conv(h, *args, **kwargs)return x + helse:if self.conv is not None and self.ckpt_grad and x.requires_grad:h = checkpoint(self.conv, x, *args, **kwargs)else:h = self.conv(x, *args, **kwargs)if self.norm is not None:h = self.norm(h)if self.act is not None:h = self.act(h)if self.block == 'res':h = x + helif self.block == 'dense':h = torch.cat([x, h], dim=-1)elif self.block == 'plain':passreturn F.dropout(h, p=self.dropout, training=self.training)def __repr__(self) -> str:return f'{self.__class__.__name__}(block={self.block})'

注释:pytoch checkpoint

torch.utils.checkpoint — PyTorch 1.13 documentation

torch.utils.checkpoint 简介 和 简易使用_ONE_SIX_MIX的博客-CSDN博客

pytorch 的 checkpoint 是一种用时间换显存的技术,一般训练模式下,pytorch 每次运算后会保留一些中间变量用于求导,而使用 checkpoint 的函数,则不会保留中间变量,中间变量会在求导时再计算一次,因此减少了显存占用,这个 checkpoint 用的好的话,训练时相比不使用 checkpoint 的模型可以增加 30% 的批量大小。

参考:

[2006.07739] DeeperGCN: All You Need to Train Deeper GCNs (arxiv.org)

[1904.03751] DeepGCNs: Can GCNs Go as Deep as CNNs? (arxiv.org)

torch_geometric.nn — pytorch_geometric documentation (pytorch-geometric.readthedocs.io)

torch.utils.checkpoint — PyTorch 1.13 documentation

torch.utils.checkpoint 简介 和 简易使用_ONE_SIX_MIX的博客-CSDN博客
geometric/blob/master/examples/ogbn_proteins_deepgcn


http://chatgpt.dhexx.cn/article/VFkxloJt.shtml

相关文章

Gated-SCNN: Gated Shape CNNs for Semantic Segmentation

目录 作者 一、Model of Gated-SCNN 二、 Gated Shape CNN 1.Regular Stream 2.Shape Stream 3. Gate Conv Layer 4.ASPP 5 总代码 三 损失函数 1.BoundaryBCELoss 2.DualTaskLoss 作者 一、Model of Gated-SCNN 文章使用了双流CNN来处理语义分割中的边界问题,分为R…

(整理)吊炸天的CNNs,这是我见过最详尽的图解!(下)

之前在CSDN上看到这篇文章,觉得通俗易懂,写的非常好。不过近来再次查看,发现文章的照片莫名其妙的没有了,没有图就根本看不懂了。找到了之前关注的微信公众号:AI传送门 。 在里面找到了这篇文章,决定再把这…

CNNs详尽图解

已经成为每一个初入人工智能——特别是图像识别领域的朋友,都渴望探究的秘密。 本文通过“算法可视化”的方法,将卷积神经网络的原理,呈献给大家。教程分为上、下两个部分,通篇长度不超过7000字,没有复杂的数学公式&a…

学习笔记:利用CNNs进行图像分类

1.神经网络图像(CNNs)分类简介 本文将重点关注卷积神经网络,也被称为CNNs或Convnets。CNNs是一种特殊类型的神经网络,特别适合于图像数据。自2012年以来,ImageNet竞赛(ImageNet)一直由CNN架构赢得。 在本文中&#x…

(整理)吊炸天的CNNs,这是我见过最详尽的图解!(上)

之前在CSDN上看到这篇文章,觉得通俗易懂,写的非常好。不过近来再次查看,发现文章的照片莫名其妙的没有了,没有图就根本看不懂了。找到了之前关注的微信公众号:AI传送门 。 在里面找到了这篇文章,决定再把这…

交叉验证

概述Holdout 交叉验证K-Fold 交叉验证Leave-P-Out 交叉验证总结 概述 交叉验证是在机器学习建立模型和验证模型参数时常用的办法。 顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集。 用训练集来训练模型&…

交叉验证评估模型性能

在构建一个机器学习模型之后,我们需要对模型的性能进行评估。如果一个模型过于简单,就会导致欠拟合(高偏差)问题,如果模型过于复杂,就会导致过拟合(高方差)问题。为了使模型能够在欠拟合和过拟合之间找到一个折中方案,我们需要对模型进行评估,后面将会介绍holdout交叉…

Python实现:Hold-Out、k折交叉验证、分层k折交叉验证、留一交叉验证

模型在统计中是极其重要的,可以通过模型来描述数据集的内在关系,了解数据的内在关系有助于对未来进行预测。一个模型可以通过设置不同的参数来描述不同的数据集,有的参数需要根据数据集估计,有的参数需要人为设定(超参…

深度理解hold-out Method(留出法)和K-fold Cross-Validation(k折交叉验证法)

模型评估(Model Evaluation) 1.测试集(testing set) 测试集(testing set): 通常,我们可通过实验测验来对学习器的泛化误差进行评估并进而做出选择,为此,需要一个“测试集”来测试学习器对新样本的判别能力。然后以测试集上的“测…

cross-validation:从 holdout validation 到 k-fold validation

构建机器学习模型的一个重要环节是评价模型在新的数据集上的性能。模型过于简单时,容易发生欠拟合(high bias);模型过于复杂时,又容易发生过拟合(high variance)。为了达到一个合理的 bias-vari…

《The reusable holdout: Preserving validity in adaptive data analysis》中文翻译

写在前面:这是我看到的第一篇发在《science》上的文章,将近年来比较火的差分隐私用在解决过机器学习中的过拟合上,效果很棒。这是15年的文章,现在已经17年了,网上居然没有中文翻译,我就粗略的翻译一下给后来…

机器学习模型评测:holdout cross-validation k-fold cross-validation

cross-validation:从 holdout validation 到 k-fold validation 2016年01月15日 11:06:00 Inside_Zhang 阅读数:4445 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanchunhui/article/details/5…

三种模型验证方法:holdout, K-fold, leave one out cross validation(LOOCV)

Cross Validation: A Beginner’s Guide An introduction to LOO, K-Fold, and Holdout model validation By: Caleb Neale, Demetri Workman, Abhinay Dommalapati 源自:https://towardsdatascience.com/cross-validation-a-beginners-guide-5b8ca04962cd 文章目录…

模型检验方法:holdout、k-fold、bootstrap

参考:https://www.cnblogs.com/chay/articles/10745417.html https://www.cnblogs.com/xiaosongshine/p/10557891.html 1.Holdout检验 Holdout 检验是最简单也是最直接的验证方法, 它将原始的样本集合随机划分成训练集和验证集两部分。 比方说&#x…

多种方式Map集合遍历

1.如何遍历Map中的key-value对,代码实现(至少2种) Map集合的遍历(方式1)键找值: package com.B.Container_13.Map;import java.util.HashMap; import java.util.Map; import java.util.Set;//Map集合的遍历(方式1)键找值 public class Map04_01 {publi…

Map集合中的四种遍历方式

1.Map接口的概述 &#xff08;1&#xff09;它是双列集合&#xff1b; &#xff08;2&#xff09;格式&#xff1a;Interface Map<k,v> K:键的类型 V&#xff1a;值得类型 &#xff08;3&#xff09;它的每个元素都包含一个键对象Key和值对象Value&#xff0c;并且他们…

Java中的Map集合以及Map集合遍历实例

文章目录 一、Map集合二、Map集合遍历实例 一、Map集合 Map<K,V>k是键&#xff0c;v是值 1、 将键映射到值的对象&#xff0c;一个映射不能包含重复的键&#xff0c;每个键最多只能映射的一个值 2、 实现类  a) HashMap  b) TreeMap 3、 Map集合和Collection集合的区别…

Map集合的四种遍历

Map集合的四种遍历 这里记录一下map集合的4种遍历&#xff1a; 第一种 得到所有的key–map.keySet() ,根据key拿到value–map.get(key) public static void main(String[] args) {Map<String, String> map new HashMap();map.put("1", "刘备");…

Map集合遍历的三种方式

Map集合遍历的三种方式 遍历Map集合的三种方式 键找值键值对Lambda表达式 方式一 : 键找值 先获取Map集合的全部键的Set集合遍历键的Set集合,然后通过键提取对应值 原理图 键找值涉及到的API 方法名称说明Set keySet()获取所有键的集合V get(Object key)根据键获取值 Map…