Как в этом контексте вычисляется «отображенный тензор»? - PullRequest
0 голосов
/ 16 июня 2020

Я читаю здесь документы PyTorch Geometri c: https://pytorch-geometric.readthedocs.io/en/latest/notes/create_gnn.html

Они объясняют код «basi c»:

import torch
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(GCNConv, self).__init__(aggr='add')  # "Add" aggregation.
    self.lin = torch.nn.Linear(in_channels, out_channels)

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 normalization
    row, col = edge_index
    deg = degree(row, x.size(0), dtype=x.dtype)
    deg_inv_sqrt = deg.pow(-0.5)
    norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]

    # Step 4-6: Start propagating messages.
    return self.propagate(edge_index, size=(x.size(0), x.size(0)), x=x,
                          norm=norm)

def message(self, x_j, norm):
    # x_j has shape [E, out_channels]

    # Step 4: Normalize node features.
    return norm.view(-1, 1) * x_j

def update(self, aggr_out):
    # aggr_out has shape [N, out_channels]

    # Step 6: Return new node embeddings.
    return aggr_out

Пояснение содержит этот абзац:

«В функции message () нам нужно нормализовать характеристики соседнего узла x_j. Здесь x_j обозначает отображаемый тензор, который содержит характеристики соседнего узла каждого ребра. Функции узла могут быть автоматически сопоставлены, добавив _i или _j к имени переменной. Фактически, любой тензор может быть сопоставлен таким образом, если он имеет ? записей в его первом измерении. "

Вопросы : Я знаю, что отображенный тензор x_j - это тензор, который содержит свойства соседних узлов каждого ребра. Как они вычисляли x_j? Означает ли это, что если я изменю имя x на x_i, у меня автоматически будет «сопоставленный тензор»?

...