pytorch index_add_用法介绍

x.index_add_(0, assi, y)

代表将y中的每一个向量,分别加在x的不同向量上,具体加在x的哪一个向量上看assi。

x是被加数,y是加数,结果是和。该函数的三个参数分别是:

第一个参数0代表相加的维度,

第二个参数assi代表相加的项目,

第三个参数y代表加数。

如下图,以全0的x为例子,在dim=0上用y加在x上。

 

该函数中参数assi的最外一个维度和y的最外一个维度必须保持一致,x的相加维度和y的相加维度的维度必须保持一致。比如,assi是[ dim1, ],y是[ dim1, dim2 ],x是[ XX, dim2]。

上述例子中,assi是[3,],y是[3,3],x是[3,3],满足维度要求。

那么该函数的实际意义就是:

按照assi的指定,将y的依次项加到x的指定index上去,本例子中assi是[1, 1, 2],就是说将y的第零个向量,第一个向量,第二个向量,分别加到x的index为1,1,2的向量上面去。

得到结果如下:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GAT (Graph Attention Network) 是一种基于注意力机制的图神经网络模型,适用于节点分类、图分类等任务。 以下是使用 PyTorch 实现 GAT 模型的代码示例: ```python import torch import torch.nn.functional as F from torch_geometric.nn import MessagePassing from torch_geometric.utils import add_self_loops, degree class GATLayer(MessagePassing): def __init__(self, in_channels, out_channels): super(GATLayer, self).__init__(aggr='add') # "Add" aggregation. self.lin = torch.nn.Linear(in_channels, out_channels) self.att = torch.nn.Linear(2*out_channels, 1) 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 2: Linearly transform node feature matrix. x = self.lin(x) # Step 3: Compute attention coefficients. edge_src, edge_dst = edge_index x_i = x[edge_src] # [E, out_channels] x_j = x[edge_dst] # [E, out_channels] alpha = self.att(torch.cat([x_i, x_j], dim=-1)) # [E, 1] alpha = F.leaky_relu(alpha, negative_slope=0.2) alpha = torch.softmax(alpha, dim=0) # [E, 1] # Step 4: Message passing. return self.propagate(edge_index, x=x, alpha=alpha) def message(self, x_j, alpha): # x_j has shape [E, out_channels] # alpha has shape [E, 1] return alpha * x_j def update(self, aggr_out): # aggr_out has shape [N, out_channels] return aggr_out class GAT(torch.nn.Module): def __init__(self, in_channels, hidden_channels, out_channels, num_layers): super(GAT, self).__init__() self.layers = torch.nn.ModuleList() self.layers.append(GATLayer(in_channels, hidden_channels)) for i in range(num_layers - 2): self.layers.append(GATLayer(hidden_channels, hidden_channels)) self.layers.append(GATLayer(hidden_channels, out_channels)) def forward(self, x, edge_index): for layer in self.layers: x = F.elu(layer(x, edge_index)) return x ``` 在上述代码中,`GATLayer` 类表示 GAT 网络中的一层,`GAT` 类表示整个 GAT 网络。`GATLayer` 类继承自 `MessagePassing` 类,表示使用消息传递机制进行计算,`GAT` 类继承自 `torch.nn.Module` 类。在 `GATLayer` 类中,`forward` 方法表示前向传播过程,其中包括添加自环、线性变换、计算注意力系数、消息传递等操作;`message` 方法表示消息传递过程;`update` 方法表示节点更新过程。在 `GAT` 类中,`__init__` 方法中定义了多个 GAT 层,`forward` 方法中通过多次调用 GAT 层实现整个网络的前向传播过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值