dgl库中一些模型的使用

SumPooling

import dgl
import torch
from dgl.nn.pytorch.glob import SumPooling

# 创建一个示例图
g = dgl.graph(([0, 1, 2], [1, 2, 0]))

# 假设每个节点有一个特征向量
node_features = torch.randn(3, 10)  # 3个节点,每个节点有10维特征
g.ndata['h'] = node_features
# 使用SumPooling进行全局池化
sum_pooling = SumPooling()
global_feature = sum_pooling(g, g.ndata['h'])
print(g.ndata['h'])
print("Global pooled feature shape:", global_feature.shape)#(1,10)
print(global_feature)
作用就是将图中的多个点的特征进行累加

Set2Set

import dgl
import torch
from dgl.nn.pytorch.glob import Set2Set

# 创建一个示例图
g = dgl.graph(([0, 1, 2], [1, 2, 0]))

# 假设每个节点有一个特征向量
node_features = torch.randn(3, 64)  # 3个节点,每个节点有10维特征

g.ndata['h'] = node_features

# 使用Set2Set进行全局池化
set2set_pooling = Set2Set(64,3,2)  # (点的特征维度,迭代次数,迭代层数)
global_feature = set2set_pooling(g, g.ndata['h'])

print("Global pooled feature shape:", global_feature.shape)# (1,128)
"""
最终将点汇聚为一个全局特征,维度变为了之前的二倍。
"""
Set2Set 是一种用于图神经网络(GNN)中处理节点嵌入的强大算法。它被设计用来解决传统GNN结构中存在的排列不变性的挑战。

排列不变性:传统的GNN(如图卷积网络GCN)会按照固定顺序处理节点,因此对节点输入的顺序敏感。Set2Set 则是基于节点集合操作,并且设计成排列不变的,即无论节点输入的顺序如何,它都能产生相同的输出。

聚合机制:Set2Set 使用可学习的聚合机制,灵感来自于长短期记忆网络(LSTM)。它通过多次注意节点嵌入来迭代地优化集合级别的表示。这使得它能够捕捉图中节点之间的依赖关系和交互作用。

应用场景:它通常用于那些节点顺序无意义或不应影响最终图级表示的任务中。例如,图分类任务需要根据图的结构而不是单个节点的属性来进行分类。

优势:通过引入Set2Set,GNN能够更有效地将节点特征聚合成图级别的表示。它有助于学习更具表达力的表示,有效地总结图中所有节点的信息。

GlobalAttentionPooling

import dgl
import torch as th
from dgl.nn import GlobalAttentionPooling
g1 = dgl.rand_graph(3, 4)  # g1 is a random graph with 3 nodes and 4 edges
g1_node_feats = th.rand(3, 5)  # feature size is 5
gate_nn = th.nn.Linear(5, 1)  # the gate layer that maps node feature to scalar
gap = GlobalAttentionPooling(gate_nn)  # create a Global Attention Pooling layer
temp=gap(g1, g1_node_feats)
print(temp)#(1,5)
GlobalAttentionPooling 的实现:
dgl.nn.pytorch.glob.GlobalAttentionPooling实现了这一思想,它结合了以下几个关键步骤:
初始化权重: 在初始化时,通过一个可学习的参数矩阵来计算每个节点的注意力权重。
计算注意力分数: 对于每个节点,通过乘以权重矩阵,得到其在注意力机制下的表示。这一步骤考虑了每个节点与其他节点之间的关系。
应用注意力机制: 将计算得到的注意力分数经过 softmax 函数归一化,以确保注意力权重的有效性和合理性。
特征聚合: 使用归一化后的注意力权重对节点的特征进行加权求和,从而生成整个图的表示。
输出表示: 最终,得到的图级别表示可以作为后续任务(如图分类)的输入。

SetTransformerEncoder

import dgl
import torch as th
from dgl.nn import SetTransformerEncoder

g1 = dgl.rand_graph(3, 4)  # g1 is a random graph with 3 nodes and 4 edges
g1_node_feats = th.rand(3, 5)  # feature size is 5

set_trans_enc = SetTransformerEncoder(5, 4, 4, 20)  #(输入维度 (input_dim),编码器层数 (num_layers),注意力头数 (num_heads),隐藏层维度 (hidden_dim):)
temp=set_trans_enc (g1,g1_node_feats)
print(temp)#(3,5)
SetTransformerEncoder 可能是一个用于集合(Set)数据的变换器编码器,它可能具有以下特点:
自注意力机制:允许模型在处理图节点时,考虑节点之间的关系,而不仅仅是局部邻域信息。
多头注意力:通过多个注意力头并行处理信息,以捕获不同子空间的信息。
位置编码:尽管自注意力机制不关心序列中元素的顺序,但在图数据中,节点的相对位置或特征仍然重要,因此可能需要位置编码。
前馈网络:在自注意力层之后,通常会有一个前馈网络来进一步处理信息。

SortPooling

import dgl
import torch as th
from dgl.nn import SortPooling

g1 = dgl.rand_graph(3, 4)  # g1 is a random graph with 3 nodes and 4 edges
g1_node_feats = th.rand(3, 5)  # feature size is 5
print(g1_node_feats)
sortpool = SortPooling(k=2)  # create a sort pooling layer

temp=sortpool(g1,g1_node_feats)
print(temp)#(1,5*k)即(1,10)
SortPooling 层是全局池化的一种形式,它将图中的节点根据某种排序标准进行排序,然后选择前 k 个节点的邻居信息进行聚合。这种池化操作有助于捕获图中的全局结构信息,并且可以减少图的规模,从而减少计算量。

下面是 SortPooling 层的一些关键点:

排序标准:SortPooling 层可以根据节点的特征值进行排序。例如,可以基于节点的度(即邻居数量)、节点的嵌入向量的大小或其他自定义的标准。

选择节点:层会根据排序结果选择前 k 个节点。这些节点通常被认为是图中最重要的节点,可能是图中的中心节点或者是具有较高度的节点。

聚合操作:对于选定的节点,SortPooling 层会聚合它们的邻居信息。聚合可以是求和、平均、最大值等。

输出:SortPooling 层的输出是一个固定大小的向量,这个向量包含了聚合后的全局信息。

应用场景:这种池化操作在处理图数据时非常有用,尤其是在需要捕获全局结构信息的场景中,比如社交网络分析、分子结构分析等。

参数 k:k 是一个超参数,表示在排序后选择的节点数量。这个值可以根据具体任务和图的大小来调整。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SAT(布尔可满足性问题)是计算机科学中一个非常重要的问题,其解决方法可以应用于很多领域,例如计算机科学、人工智能、计算机网络和密码学等。在SAT问题中,我们需要找到一组布尔变量的赋值,使得一个逻辑公式能够被满足。 DGL(Deep Graph Library)是一个用于图神经网络的Python库。它提供了一组高效的API,用于构建、训练和评估图神经网络模型。为了使用dgl实现SAT模型,我们可以将SAT问题转换为一个图结构,其中节点代表布尔变量,边代表逻辑关系。然后,我们可以使用dgl构建和训练图神经网络模型,以解决SAT问题。 以下是一个简单的SAT模型实现,使用dgl库来构建和训练图神经网络模型: ``` import dgl import torch import torch.nn as nn import torch.nn.functional as F # Convert SAT problem to graph def sat_to_graph(clauses): g = dgl.graph() # Add nodes n = len(clauses) g.add_nodes(n) # Add edges for i in range(n): for j in range(n): if i != j: for a in clauses[i]: for b in clauses[j]: if a == -b: g.add_edge(i, j) return g # Define graph convolutional neural network model class GCN(nn.Module): def __init__(self, in_feats, hidden_feats, out_feats): super(GCN, self).__init__() self.conv1 = dgl.nn.GraphConv(in_feats, hidden_feats) self.conv2 = dgl.nn.GraphConv(hidden_feats, out_feats) def forward(self, g, inputs): h = self.conv1(g, inputs) h = F.relu(h) h = self.conv2(g, h) return h # Define training function def train(model, g, inputs, labels, optimizer): model.train() logits = model(g, inputs) loss = F.cross_entropy(logits, labels) optimizer.zero_grad() loss.backward() optimizer.step() return loss.item() # Define test function def test(model, g, inputs, labels): model.eval() with torch.no_grad(): logits = model(g, inputs) pred = logits.argmax(1) acc = (pred == labels).float().mean() return acc.item() # Define main function if __name__ == '__main__': # Define SAT problem clauses = [[1, 2, -3], [-1, -2, 3], [2, 3, 4], [1, -3, 4], [-2, -4]] # Convert SAT problem to graph g = sat_to_graph(clauses) # Define model and optimizer model = GCN(g.ndata['feat'].shape[1], 16, 2) optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # Train and test model for epoch in range(100): loss = train(model, g, g.ndata['feat'], g.ndata['label'], optimizer) acc = test(model, g, g.ndata['feat'], g.ndata['label']) print('Epoch {:03d} | Loss {:.4f} | Accuracy {:.4f}'.format(epoch, loss, acc)) ``` 在这个例子中,我们首先将SAT问题转换为一个图结构,然后定义了一个包含两层图卷积层的GCN模型。我们使用Adam优化器来训练模型,每个epoch都计算训练损失和测试准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值