如何解决如何正确重塑张量?
我正在尝试使用pytorch几何实现经典GCN模型的归一化相邻矩阵,如下所示,代码摘自文档
import torch
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops,degree
import torch
from torch_geometric.data import Data
from torch_geometric.utils import erdos_renyi_graph
edge_index = erdos_renyi_graph(50,edge_prob=0.2)
x = torch.eye(50,50)
data = Data(edge_index=edge_index,x=x,)
edge_index,_ = add_self_loops(edge_index,num_nodes=data.x.size(0))
row,col = edge_index
deg = degree(col,x.size(0),dtype=x.dtype)
deg_inv_sqrt = deg.pow(-0.5)
norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]
print(norm.size()
此张量的输出为torch.Size([500])
如何获得(50,50)的输出? 任何帮助将不胜感激
解决方法
我认为您很困惑,因为PyTorch Geometric使用邻接矩阵的压缩或稀疏表示。 我是PyTorch的新手,但以下内容将为您提供想要的东西:
import torch
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops,degree
from torch_geometric.data import Data
from torch_geometric.utils import erdos_renyi_graph
from torch_geometric.utils import to_dense_adj
edge_index = erdos_renyi_graph(5,edge_prob=0.3)
x = torch.eye(5,5)
data = Data(edge_index=edge_index,x=x)
edge_index,_ = add_self_loops(edge_index,num_nodes=data.x.size(0))
row,col = edge_index
# build adjacency matrix
# from sparse to dense representation
adj = to_dense_adj(edge_index)[0]
deg = degree(col,x.size(0),dtype=x.dtype)
deg_inv_sqrt = deg.pow(-0.5)
norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]
# build "normalized" adjacency matrix
normalized_adj = adj * torch.ger(deg_inv_sqrt,deg_inv_sqrt)
print(normalized_adj)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。