首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >matmul=‘add’的函数是否等于matmul(adjacency_matrix,feature_matrix)?

matmul=‘add’的函数是否等于matmul(adjacency_matrix,feature_matrix)?
EN

Stack Overflow用户
提问于 2022-07-07 15:39:04
回答 1查看 56关注 0票数 0

我有一个关于以下代码的问题。特别是在(1)中,它是专门的:

代码语言:javascript
运行
复制
__init__(aggr='add') 

(2)中,我没有像(1)中那样的aggr='add‘,而是在邻接矩阵(edge_index)和节点(X_j)之间进行乘法:

代码语言:javascript
运行
复制
matmul(edge_index, x_j)

说它们是一样的,产生同样的结果,这是正确的吗?

码(1)

代码语言:javascript
运行
复制
import torch
from torch.nn import Linear, Parameter
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops, degree

class GCNConv(MessagePassing):
    def __init__(self, in_channels, out_channels):
        super().__init__(aggr='add') 
        self.reset_parameters()

    def reset_parameters(self):
        self.lin.reset_parameters()
        

    def forward(self, x, edge_index):
        # x has shape [N, in_channels]
        # edge_index has shape [2, E]

        # Step 1: Add self-loops to the adjacency matrix.
        edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))

        # Step 4-5: Start propagating messages.
        out = self.propagate(edge_index, x=x)

        return out

    def message(self, x_j):
        return x_j

码(2)

代码语言:javascript
运行
复制
import torch
from torch.nn import Linear, Parameter
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops, degree

class GCNConv(MessagePassing):
    def __init__(self, in_channels, out_channels):
        super().__init__() 
        self.reset_parameters()

    def reset_parameters(self):
        self.lin.reset_parameters()


    def forward(self, x, edge_index):
        # x has shape [N, in_channels]
        # edge_index has shape [2, E]

        edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))

        out = self.propagate(edge_index, x=x)

        return out

    def message_and_aggregate(self, edge_index, x_j):
        return matmul(edge_index, x_j)
EN

回答 1

Stack Overflow用户

发布于 2022-07-29 06:23:29

正如您所描述的(实际上,您的代码中有一些错误,代码可能无法成功运行),代码1只是添加了邻居节点的特性和自身(有一个自循环)来获得更新的特征,代码2是将特征(包括自己的特征)乘以邻接矩阵,这也增加了相邻节点的特性(矩阵的对应位置为1)。因此,两者基本上没有区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72900676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档