Как правильно изменить форму тензора?

#python #reshape #tensor

#python #изменить форму #тензор

Вопрос:

Я пытаюсь реализовать нормализованную смежную матрицу классической модели GCN, используя pytorch geometric, как показано ниже, код взят из документации

 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)? Любая помощь будет оценена

Ответ №1:

Я думаю, вы в замешательстве, потому что 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)