GCN之形成标准化邻接矩阵

 

GCN中一个重要的矩阵是邻接矩阵,其中一个重要操作步骤是邻接矩阵标准化,这里介绍两种建立标准化邻接矩阵。

import torch
import numpy as np
impoer scipy.sparse as sp

def normalize_adj(adj):
    adj = adj.to_dense().cpu().numpy()
    adj = sp.coo_matrix(adj)     #构建张量
    rowsum = np.array(adj.sum(1))#每行的数加在一起
    d_inv_sqrt = np.power(rowsum, -0.5).flatten()    #输出rowsum ** -1/2
    d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0.            #溢出部分赋值为0
    d_mat_inv_sqrt = sp.diags(d_inv_sqrt)            #对角化
    adj = adj.dot(d_mat_inv_sqrt).transpose().dot(d_mat_inv_sqrt).tocoo()    #转置后相乘
    return torch.FloatTensor(adj.todense()).cuda()

第二种方法是利用torch来构建标准化邻接矩阵:

import torch
import numpy as np
impoer scipy.sparse as sp

def normalize_adj_torch(mx):
    mx = mx.to_dense()           #构建张量
    rowsum = mx.sum(1)           #每行的数加在一起
    r_inv_sqrt = torch.pow(rowsum, -0.5).flatten()   #输出rowsum ** -1/2
    r_inv_sqrt[torch.isinf(r_inv_sqrt)] = 0.         #溢出部分赋值为0
    r_mat_inv_sqrt = ttorch.diag(r_inv_sqrt)         #对角化
    mx = torch.matmul(mx, r_mat_inv_sqrt)
    mx = torch.transpose(mx, 0, 1)                   #转置
    mx = torch.matmul(mx, r_mat_inv_sqrt)
    return mx

附:

torch.mm(mat1, mat2) 只能进行矩阵乘法,也就是输入的两个 tensor 维度只能是 (n x m) 和 (m x p)

torch.bmm(batch1, batch2) 是两个三维张量相乘,两个输入tensor维度是 (b x n x m) 和 (b x m x p),第一维 b 代表 batch size,输出为 (b x n x p)

torch.matmul(tesnsor1, tensor2) 可以进行张量乘法,输入可以是高维。比如 tensor1 是 (j x 1 x n x m), tensor2 是 (k x m x p),输出为 (j x k x n x p)

你可能感兴趣的:(GNN)