组队学习-图神经网络 Taks 06

GNN Pooling(二):Pointer Networks,NIPS2015;SEQUENCE TO SEQUENCE FOR SETS,ICLR,2016 Pointer Networks简称Ptr-Net,是在Seq2Seq的基础上进行的改进。对于Seq2Seq的任务,输入输出都是任意的,而对于一些实际的问题,输出的长度、内容严重依赖于输入(甚至就是从输入中选出一部分作为输出),为了解决这个问题,Ptr-Net被提出来。其本质就是对Self-Attention进行的简单改进,使用注意力作为指针来选择输入序列中的一个成员作为输出。本文也在三个常见的任务中证实了Ptr-Net的有效性。 Ptr-Net也有着广泛的应用,比如文本摘要,比如图池化(Set2Set)。 阅读详情

1、基于图同构网络(GIN)的图表征

     采用GINNodeEmbedding模块对图上每一个节点做节点嵌入(Node Embedding),得到节点表征;然后对节点表征做图池化得到图的表征;最后用一层线性变换对图表征转换为对图的预测。

    基于结点表征计算得到图表征的方法有:

    (1)sum:对节点表征求和;

    (2)mean:对节点表征求平均;

    (3)max:取节点表征的最大值,对一个batch中所有节点计算节点表征各个维度的最大值;

    (4)attention:基于Attention对节点表征加权求和

    (5)set2set: 基于Attention对节点表征加权求和的方法;

  基于图同构网络的节点嵌入模块

    (1)用`AtomEncoder`对其做嵌入得到第`0`层节点表征

    (2)逐层计算节点表征

    (3)结点i的表征最远能捕获到结点i的距离为num_layers的邻接节点的信息

    GINConv图同构卷积层

    图同构卷积层的数学定义如下:

 \mathbf{x}^{\prime}_i = h_{\mathbf{\Theta}} \left( (1 + \epsilon) \cdot \mathbf{x}_i + \sum_{j \in \mathcal{N}(i)} \mathbf{x}_j \right)

 2、Weisfeiler-Lehman Test (WL Test)

    两个图是同构的,意思是两个图拥有一样的拓扑结构,也就是说,我们可以通过重新标记节点从一个图转换到另外一个图。Weisfeiler-Lehman 图的同构性测试算法,简称WL Test,是一种用于测试两个图是否同构的算法。

    (1)聚合自身与邻接节点的标签得到一串字符串,自身标签与邻接节点的标签中间用,分隔,邻接节点的标签按升序排序。

    (2)标签散列,即标签压缩,将较长的字符串映射到一个简短的标签。

    (3)给节点重新打上标签。

3、实验代码

     (1)GINNodeEmbedding节点嵌入。

 

import torch
from torch import nn
from torch_geometric.nn import global_add_pool, global_mean_pool, global_max_pool, GlobalAttention, Set2Set
from gin_node import GINNodeEmbedding

class GINGraphRepr(nn.Module):

    def __init__(self, num_tasks=1, num_layers=5, emb_dim=300, residual=False, drop_ratio=0, JK="last", graph_pooling="sum"):
        """GIN Graph Pooling Module
        Args:
            num_tasks (int, optional): number of labels to be predicted. Defaults to 1 (控制了图表征的维度,dimension of graph representation).
            num_layers (int, optional): number of GINConv layers. Defaults to 5.
            emb_dim (int, optional): dimension of node embedding. Defaults to 300.
            residual (bool, optional): adding residual connection or not. Defaults to False.
            drop_ratio (float, optional): dropout rate. Defaults to 0.
            JK (str, optional): 可选的值为"last"和"sum"。选"last",只取最后一层的结点的嵌入,选"sum"对各层的结点的嵌入求和。Defaults to "last".
            graph_pooling (str, optional): pooling method of node embedding. 可选的值为"sum","mean","max","attention"和"set2set"。 Defaults to "sum".

        Out:
            graph representation
        """
        super(GINGraphPooling, self).__init__()

        self.num_layers = num_layers
        self.drop_ratio = drop_ratio
        self.JK = JK
        self.emb_dim = emb_dim
        self.num_tasks = num_tasks

        if self.num_layers < 2:
            raise ValueError("Number of GNN layers must be greater than 1.")

        self.gnn_node = GINNodeEmbedding(num_layers, emb_dim, JK=JK, drop_ratio=drop_ratio, residual=residual)

        # Pooling function to generate whole-graph embeddings
        if graph_pooling == "sum":
            self.pool = global_add_pool
        elif graph_pooling == "mean":
            self.pool = global_mean_pool
        elif graph_pooling == "max":
            self.pool = global_max_pool
        elif graph_pooling == "attention":
            self.pool = GlobalAttention(gate_nn=nn.Sequential(
                nn.Linear(emb_dim, emb_dim), nn.BatchNorm1d(emb_dim), nn.ReLU(), nn.Linear(emb_dim, 1)))
        elif graph_pooling == "set2set":
            self.pool = Set2Set(emb_dim, processing_steps=2)
        else:
            raise ValueError("Invalid graph pooling type.")

        if graph_pooling == "set2set":
            self.graph_pred_linear = nn.Linear(2*self.emb_dim, self.num_tasks)
        else:
            self.graph_pred_linear = nn.Linear(self.emb_dim, self.num_tasks)

    def forward(self, batched_data):
        h_node = self.gnn_node(batched_data)

        h_graph = self.pool(h_node, batched_data.batch)
        output = self.graph_pred_linear(h_graph)

        if self.training:
            return output
        else:
            # At inference time, relu is applied to output to ensure positivity
            # 因为预测目标的取值范围就在 (0, 50] 内
            return torch.clamp(output, min=0, max=50)

    (2)GINNodeEmbedding Module

import torch
from mol_encoder import AtomEncoder
from gin_conv import GINConv
import torch.nn.functional as F

# GNN to generate node embedding
class GINNodeEmbedding(torch.nn.Module):
    """
    Output:
        node representations
    """

    def __init__(self, num_layers, emb_dim, drop_ratio=0.5, JK="last", residual=False):
        """GIN Node Embedding Module"""

        super(GINNodeEmbedding, self).__init__()
        self.num_layers = num_layers
        self.drop_ratio = drop_ratio
        self.JK = JK
        # add residual connection or not
        self.residual = residual

        if self.num_layers < 2:
            raise ValueError("Number of GNN layers must be greater than 1.")

        self.atom_encoder = AtomEncoder(emb_dim)

        # List of GNNs
        self.convs = torch.nn.ModuleList()
        self.batch_norms = torch.nn.ModuleList()

        for layer in range(num_layers):
            self.convs.append(GINConv(emb_dim))
            self.batch_norms.append(torch.nn.BatchNorm1d(emb_dim))

    def forward(self, batched_data):
        x, edge_index, edge_attr = batched_data.x, batched_data.edge_index, batched_data.edge_attr

        # computing input node embedding
        h_list = [self.atom_encoder(x)]  # 先将类别型原子属性转化为原子表征
        for layer in range(self.num_layers):
            h = self.convs[layer](h_list[layer], edge_index, edge_attr)
            h = self.batch_norms[layer](h)
            if layer == self.num_layers - 1:
                # remove relu for the last layer
                h = F.dropout(h, self.drop_ratio, training=self.training)
            else:
                h = F.dropout(F.relu(h), self.drop_ratio, training=self.training)

            if self.residual:
                h += h_list[layer]

            h_list.append(h)

        # Different implementations of Jk-concat
        if self.JK == "last":
            node_representation = h_list[-1]
        elif self.JK == "sum":
            node_representation = 0
            for layer in range(self.num_layers + 1):
                node_representation += h_list[layer]

        return node_representation

     (3)BondEncoder与AtomEncoder

import torch
from ogb.utils.features import get_atom_feature_dims, get_bond_feature_dims 

full_atom_feature_dims = get_atom_feature_dims()
full_bond_feature_dims = get_bond_feature_dims()

class AtomEncoder(torch.nn.Module):

    def __init__(self, emb_dim):
        super(AtomEncoder, self).__init__()
        
        self.atom_embedding_list = torch.nn.ModuleList()

        for i, dim in enumerate(full_atom_feature_dims):
            emb = torch.nn.Embedding(dim, emb_dim)
            torch.nn.init.xavier_uniform_(emb.weight.data)
            self.atom_embedding_list.append(emb)

    def forward(self, x):
        x_embedding = 0
        for i in range(x.shape[1]):
            x_embedding += self.atom_embedding_list[i](x[:,i])

        return x_embedding


class BondEncoder(torch.nn.Module):
    
    def __init__(self, emb_dim):
        super(BondEncoder, self).__init__()
        
        self.bond_embedding_list = torch.nn.ModuleList()

        for i, dim in enumerate(full_bond_feature_dims):
            emb = torch.nn.Embedding(dim, emb_dim)
            torch.nn.init.xavier_uniform_(emb.weight.data)
            self.bond_embedding_list.append(emb)

    def forward(self, edge_attr):
        bond_embedding = 0
        for i in range(edge_attr.shape[1]):
            bond_embedding += self.bond_embedding_list[i](edge_attr[:,i])

        return bond_embedding   

4、请画出下方图片中的6号、3号和5号节点的从1层到3层到WL子树。

 

Task06:基于图神经网络的图表征学习方法 Task06:基于图神经网络的图表征学习方法 本文参考datawhale开源学习资料 一、基于图同构网络(GIN)的图表征网络的实现 1. GINConv–图同构卷积层 提出图同构网络的论文是:How Powerful are Graph Neural Networks? ,可以参考【GNN】WL-test:GNN 的性能上界进行阅读。 图同构卷积层的数学定义如下: xi′=hΘ((1+ϵ)⋅xi+∑j∈N(i)xj) \mathbf{x}^{\prime}_i = h_{\mathbf{\Theta}} 阅读详情

相关推荐

Pytorch实现GIN(基于Message Passing消息传递机制实现)

本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1292

python内置函数系列之set(二)持续更新

python内置函数系列之set(二) 书接上回python内置函数系列之set(一) discard(丢弃,删除) 介绍: """ Remove an element from a set if it is a member. If the element is not a member, do nothing. """ 即:如果元素是成员,则从集合中删除它。如果元素不是成员,则不执行任何操作。 参数说明: disc

qq_61309211的博客 1556

从0开始写Vue项目-环境和项目搭建

什么是VueVue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)2.介绍与描述动态构建用户界面的渐进式JavaScript框架作者:尤雨溪3.Vue的特点遵循MVVM模式编码简洁,体积小,运行效率高,适合移动/PC端开发它本身只关注UI,可以引入其它第三方库开发项目4.与其他JS框架的关联借鉴 Angular 的模板和数据绑定技术借鉴 React 的组件化和虚拟DOM技术5.Vue周边库vue-cli:vue脚手架axios。

不愧是暮言的博客 1483

【GIN】

GIN

weixin_43327910的博客 9603

【入门篇】第五章 第一次与 AI Agent 交互

本文介绍了OpenClaw中最基本的用户与AI Agent交互方式,剖析了Agent和Gateway两个核心组件的作用,通过简单示例展示了从用户请求到结果返回的完整执行流程,说明了最小交互过程对验证系统可用性的重要意义,为后续学习复杂任务执行机制奠定基础。

lanyv的博客 512

自动化测试工具playwright中文文档-------1.编写测试

Playwright 测试非常简单,它们执行操作,并断言状态是否符合预期。在执行任何操作之前,无需等待任何内容:Playwright 在执行每个操作之前会自动等待一系列可操作性检查通过。此外,在执行检查时也不需要处理竞态条件——Playwright 的断言设计方式能够描述最终需要满足的期望。就这样!这些设计选择允许 Playwright 用户完全忘记他们测试中的不稳定超时和竞态检查。您将学习如何编写第一个测试如何执行操作如何使用断言测试如何在隔离环境中运行如何使用测试钩子。

2301_76646967的博客 2508

GINConv

GINConv 1. Weisfeiler-Lehman Test 论文名称:Weisfeiler-Lehman Graph Kernels 论文地址:https://www.jmlr.org/papers/volume12/shervashidze11a/shervashidze11a.pdf Weisfeiler-Lehman Test用于判断两个图是否同构。Weisfeiler-Lehman Test是一个迭代的过程, Algorithm 1给出简洁的算法描述。 这个算法的关键思想是对node节

2705

英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战:从安全手册到代码集成的避坑指南

本文深入探讨英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战应用,重点解析锁步核配置、ECC策略优化及SafeTlib库集成中的关键问题。通过代码示例和配置建议,帮助开发者实现ASIL D级别安全性,规避常见陷阱,提升汽车电子系统的功能安全合规性。

weixin_42558093的博客 404

组队学习-图神经网络 Taks 05

尝试将数据集切分成不同数量的簇进行实验,然后观察结果并进行比较。 1、设置num_parts=1500 cluster_data = ClusterData(data, num_parts=1500, recursive=False, save_dir=dataset.processed_dir) train_loader = ClusterLoader(cluster_data, batch_size=20, shuffle=True, ..

shell的专栏 646

Multisim14.3中FPGA接口电路设计:原理图项目应用

深入讲解在multisim14.3环境下构建FPGA接口电路的方法,结合原理图设计与项目实践,展现multisim14.3强大的电路仿真能力,提升数字系统开发效率。

weixin_42578963的博客 1157

Docker一键部署Synopsys EDA全家桶(VCS/Verdi 2018版)保姆级教程

本文提供了一份详尽的Docker容器化部署Synopsys EDA工具链(VCS/Verdi 2018版)的保姆级教程。通过环境隔离与标准化,解决传统安装的依赖冲突问题,并重点攻克了容器内GUI图形界面显示的核心难题。教程涵盖从Docker基础安装、镜像获取、容器启动配置,到使用X11转发或VNC实现Verdi完美显示的完整实践,旨在帮助芯片设计工程师快速构建稳定、可移植的一键化EDA工作环境。

weixin_29281941的博客 198

图神经网络task_07

图预测任务实践 本文主要参考DataWhale图神经网络组队学习 图分类 例如预测化学分子的标签 通过将获取到的节点表示经过池化得到图级别的表示,再利用图级别的表示进行损失函数的构造。 模型搭建 由于设备的关系,在对教程中的PCQM4M数据集处理存在一定问题,因此采用GIN模型对MUTAG数据集进行实验。 import os.path as osp import torch import torch.nn.functional as F from torch.nn import Sequential,

qq_41358220的博客 671

基于STM32的电子时钟设计

基于STM32的电子时钟设计1、设计目的2、设计具体要求3、proteus仿真图4、程序代码 1、设计目的 (1)掌握使用KEIL MDK5进行软件开发的具体流程; (2)掌握硬件电路的设计方法; (3)掌握STM32微控制器的程序设计及代码编写方法。 2、设计具体要求 (1)通过STM32自带的实时时钟功能获取时间信息; (2)在OLED显示屏上显示日期、时、分、秒等时间信息; (3)通过按键可对时间信息进行修改; (4)具有闹钟设定功能; (5)加分项:自行增加其他功能。 3、proteus仿真图 4

唯一的博客 2万+

用PyG (PyTorch Geometric) 中的MPNN和RDkit构建模型,并预测NCI1中smile分子的致癌性(二分类问题)

用PyG (PyTorch Geometric) 中的MPNN和RDkit构建模型,并预测NCI1中smile分子的致癌性(二分类问题)

gghhaagg的博客 2002

物理机centos7系统重启后直接进入dracut

Warning: /dev/centos/root does not exist Warning: /dev/mapper/centos-root does not exist 在shell命令行执行以下: dracut:/# lvm vgscan dracut:/# lvm vgchange -ay dracut:/# exit 之后可以正常进入系统(测试正常)。 但是重启之后依然会进入dracut模式,永久解决如下: 查看kernel文件 [root@ecs ~]# ls -ltrh /boot

魏志标的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

GIN:图神经网络的新突破

GIN(Graph Isomorphism Network)是一种基于Weisfeiler-Lehman测试的图神经网络架构,旨在最大化图表示能力,有效区分非同构图。其核心设计包括单射函数的聚合器、图嵌入的拼接以及求和操作,这些特性使其在图分类任务中表现优于GCN(Graph Convolutional Network)。GIN通过全局池化方法结合节点嵌入的求和操作和层间信息的拼接,能够更好地捕捉图的结构信息,提升分类性能。尽管在实际应用中,GIN的表现可能因数据集和任务特性而有所差异,但其理论上的优越性使

XianxinMao的博客 1409

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

torch_geometric 笔记:global_mean_pool

对全图的点嵌入(node embedding)进行池化操作,返回一个图嵌入(graph embedding) global_mean_pool( x, batch, size=None)[ x(torch.tensor) 输入的点嵌入 batch(torch.tensor) 指示点属于哪个图 size(optional) 图的数量,可以自动推断得到 ...

qq_40206371的博客 6325

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

图神经网络预训练 (4) - 节点属性预测 Attribute Prediction + 监督学习 代码

继续剖析Strategies for Pre-training Graph Neural Networks,介绍另一种节点层面的预训练方法,节点属性预测的预训练方法(Attribute Prediction)及其随后的监督学习用于分子性质预测部分。 可运行版本的代码下载,请见文末。

wufeil7的博客 5156

基于Pytorch的图神经网络构建方法(图卷积层)

基于Pytorch构建图神经网络时,模型构建中的卷积层类型与特点。

dvdxbgjmhr的博客 1514

torch_geometric.nn中ginconv和gatconv学习

使用GATConv进行图卷积操作,并调整参数以得到相同的结果。一.gatconv和ginconv的异同点。# 使用GINConv进行图卷积操作。GATConv公式如下。

qq_45477623的博客 358

GNN学习笔记(七):基于图神经网络的图表征学习方法

在此篇文章中我们将学习基于图神经网络的图表征学习方法,图表征学习要求根据节点属性、边和边的属性(如果有的话)生成一个向量作为图的表征,基于图表征我们可以做图的预测。 基于图同构网络(Graph Isomorphism Network, GIN)的图表征网络是当前最经典的图表征学习网络,我们将以它为例,将通过该网络的实现、项目实践、理论分析,三个层面来学习基于图神经网络的图表征学习方法。 图表征网络的实现 基于图同构网络的图表征学习主要包含以下两个过程: 首先计算得到节点表征; 其次对图

LuoMin2523的博客 2697

基于图同构网络(GIN)的图表征网络的实现

基于图同构网络(GIN)的图表征网络的实现 基于图同构网络的图表征学习主要包含以下两个过程: 首先计算得到节点表征; 其次对图上各个节点的表征做图池化(Graph Pooling),或称为图读 出(Graph Readout),得到图的表征(Graph Representation)。 在这里,我们将采用自顶向下的方式,来学习基于图同构模型(GIN)的图 表征学习方法。我们首先关注如何基于节点表征计算得到图的表征,而忽 略计算结点表征的方法。 基于图同构网络的图表征模块(GINGraphRepr Modu

weixin_43868001的博客 5825

基于图神经网络的图表征学习方法

图表征学习是指将整个图表示成低维、实值、稠密的向量形式,用来对整个图结构进行分析,包括图分类、图之间的相似性计算等。 相比之前的图节点,图的表征学习更加复杂,但构建的方法是建立在图节点表征的基础之上。为了高效地理解图表征学习的原理、掌握实现图表征的的工具和方法,本文先从最早的图表征方法开始介绍,然后介绍基于GNN的图表征学习方法及其Python实践。 1. 最早的图表征方法:Weisfeiler-Leman 1.1 图同构(Graph Isomorphism) 同构图是图论中的一个重要概念,一般认为如

weixu22的博客 2878

图神经网络GNN学习笔记(4):图同构网络GIN

原文:GIN: 如何设计最强大的图神经网络图神经网络(Graph Neural Networks,简称GNN)不仅仅局限于对节点进行分类,其中一个最受。

软件工程小施同学 的专栏 6715

【CS224W】(task9)图神经网络的表示能力(GIN图同构模型)

GIN图同构网络模型的构建 - 能实现判断图同构性的图神经网络需要满足,只在两个节点自身标签一样且它们的邻接节点一样时,图神经网络将这两个节点映射到相同的表征,即映射是单射性的。 - **可重复集合/多重集(Multisets):元素可重复的集合,元素在集合中没有顺序关系** 。一个节点的所有邻接节点是一个可重复集合,一个节点可以有重复的邻接节点,邻接节点没有顺序关系。因此GIN模型中生成节点表征的方法遵循WL Test算法更新节点标签的过程。 **在生成节点的表征后仍需要执行图池化(或称为图读出)操作得

发现问题,并解决问题,批判性思维 3236

PyTorch: 池化-线性-激活函数层

nn网络层-池化-线性-激活函数层 池化层 最大池化:nn.MaxPool2d() nn.AvgPool2d() nn.MaxUnpool2d() 线性层 激活函数层 nn.Sigmoid nn.tanh nn.ReLU(修正线性单元) nn.LeakyReLU nn.PReLU nn.RReLU

timerring的博客 1037
上一篇: 组队学习-图神经网络 Taks 05
下一篇: 组队学习-图预测 Taks 07
shell
博客等级 码龄16年 25粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值