2021-06-19

GNN MessagePassing类消息传递范式作业

1… 请总结MessagePassing类的运行流程以及继承MessagePassing类的
规范。

Pytorch Geometric(PyG)提供了MessagePassing基类,它实现了消息传
播的自动处理,继承该基类可使我们方便地构造消息传递图神经网络,我
们只需定义函数 ,即message() 函数,和函数 ,即 update()函数,以
及使用的消息聚合方案,即aggr=“add” 、aggr="mean"或 aggr=“max” 。
这些是在以下方法的帮助下完成的:
MessagePassing(aggr=“add”, flow=“source_to_target”,
node_dim=-2) :
aggr:定义要使用的聚合方案(“add”、"mean "或 “max”);
flow:定义消息传递的流向("source_to_target "或
“target_to_source”);
node_dim:定义沿着哪个轴线传播。
MessagePassing.propagate(edge_index, size=None,
**kwargs) :
开始传播消息的起始调用。它以edge_index (边的端点的索引)
和flow(消息的流向)以及一些额外的数据为参数。
请注意,propagate()不仅限于在形状为 [N, N] 的对称邻接矩阵
中交换消息,还可以通过传递size=(N, M)作为额外参数。例如,
在二部图的形状为[N, M] 的一般稀疏分配矩阵中交换消息。
如果设置size=None ,则假定邻接矩阵是对称的。对于有两个独立的节点集合和索引集合的二部图,并且每个集合都
持有自己的信息,我们可以传递一个元组参数,即x=(x_N,
x_M),来标记信息的区分。
MessagePassing.message(…) :
首先确定要给节点 传递消息的边的集合,如果
flow=“source_to_target” ,则是 的边的集合;
如果flow=“target_to_source” ,则是 的边的集合。
接着为各条边创建要传递给节点 的消息,即实现 函数。
MessagePassing.message(…) 函数接受最初传递给
MessagePassing.propagate(edge_index, size=None,
**kwargs) 函数的所有参数。
此外,传递给propagate()的张量可以被映射到各自的节点 和
上,只需在变量名后面加上_i 或_j 。我们把 称为消息传递的目标
中心节点,把 称为邻接节点。
MessagePassing.aggregate(…):
将从源节点传递过来的消息聚合在目标节点上,一般可选的聚合方
式有sum , mean和max 。
MessagePassing.message_and_aggregate(…) :
在一些场景里,邻接节点信息变换和邻接节点信息聚合这两项操作
可以融合在一起,那么我们可以在此函数里定义这两项操作,从而
让程序运行更加高效。
MessagePassing.update(aggr_out, …) :
为每个节点 更新节点表征,即实现 函数。该函数以聚合函数
的输出为第一个参数,并接收所有传递给propagate()函数的参数。

(1)class GCNConv(MessagePassing):
def forward(self, x, d):
return self.propagate( x=x, d=d)
def message(self, x,d):
return x,d
(2) class GCNConv(MessagePassing):
def init(self, in_channels, out_channels):
super(GCNConv, self).init(aggr=‘add’, flow=‘source_to_target’)

			def forward(self, x, d):
    				return self.propagate( x=x,  d=d)

			def aggregate(self, x=x,d=d):
    				return np.mean(x),np.mean(d)

(3) class GCNConv(MessagePassing):
def init(self, in_channels, out_channels):
super(GCNConv, self).init(aggr=‘add’, flow=‘source_to_target’)

			def forward(self, x, d):
    				return self.propagate( x=x,  d=d)

			def aggregate(self, x=x,d=d):
    				return np.mean(x),np.mean(d)
    		def update(self, inputs: Tensor) -> Tensor:
					return torch.nn.linear(inputs)
(4)  class GCNConv(MessagePassing):
			 def __init__(self, in_channels, out_channels):
    				super(GCNConv, self).__init__(aggr='add', flow='source_to_target')
    
			def forward(self, x, d):
    				return self.propagate( x=x,  d=d)

			def aggregate(self, x=x,d=d):
    				return np.mean(x),np.mean(d)
    		def update(self, inputs: Tensor) -> Tensor:
					return torch.nn.linear(inputs)
			def message_and_aggregate(self, x,d):
					return np.mean(x),np.mean(d)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值