我有一个关于以下代码的问题。特别是在(1)中,它是专门的:
__init__(aggr='add')
在(2)中,我没有像(1)中那样的aggr='add‘,而是在邻接矩阵(edge_index)和节点(X_j)之间进行乘法:
matmul(edge_index, x_j)
说它们是一样的,产生同样的结果,这是正确的吗?
码(1)
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)
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)
发布于 2022-07-29 06:23:29
正如您所描述的(实际上,您的代码中有一些错误,代码可能无法成功运行),代码1只是添加了邻居节点的特性和自身(有一个自循环)来获得更新的特征,代码2是将特征(包括自己的特征)乘以邻接矩阵,这也增加了相邻节点的特性(矩阵的对应位置为1)。因此,两者基本上没有区别。
https://stackoverflow.com/questions/72900676
复制相似问题