PyG (PyTorch Geometric) 异质图神经网络HGNN(2)

449 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天

本文首发于CSDN。

3. 可用方法

  1. 切片获取节点/边对象,返回字典形式,键是对象的属性(如x),值是属性值
paper_node_data = data['paper']
cites_edge_data = data['paper', 'cites', 'paper']
  1. 如果边类型或节点对类型可以唯一确定一种边,那这样也可以:
cites_edge_data = data['paper', 'paper']
cites_edge_data = data['cites']
  1. 增删属性、节点类型、边类型:
data['paper'].year = ...    # Setting a new paper attribute
del data['field_of_study']  # Deleting 'field_of_study' node type
del data['has_topic']       # Deleting 'has_topic' edge type
  1. metadata:一个有两个元素的元组,元素是列表。第一个列表的元素是节点类型,第二个列表的元素的边类型。
node_types, edge_types = data.metadata()
print(node_types)
['paper', 'author', 'institution']
print(edge_types)
[('paper', 'cites', 'paper'),
('author', 'writes', 'paper'),
('author', 'affiliated_with', 'institution')]
  1. 转换设备:
data = data.to('cuda:0')
data = data.cpu()
  1. 图中是否有孤立点、自环、图是否无向、转换为同质图(注意:1. 我测试了一下,如果部分节点没有特征,如在构建ogbn-mag图时没有使用preprocess入参,则转换为同质图时所有节点仍然都具有x特征(虽然在异质图中只有paper节点有特征),但本来没有标签的异质图中节点对应的特征值是NaN或者-1(具体是哪个我没看出来应该怎么判断,反正两种情况都是可能发生的)2. 原图中对应的节点/边类型会变成node_typeedge_type对应的数字)
data.has_isolated_nodes()
data.has_self_loops()
data.is_undirected()
homogeneous_data = data.to_homogeneous()
  1. 使用torch_geometric.transforms对异质图对象进行转换(很多类似同质图上的操作):
data = T.ToUndirected()(data)
data = T.AddSelfLoops()(data)
data = T.NormalizeFeatures()(data)

将异质图转换为无向图:增加反向边,使信息传播可以在各边上双向进行;如有必要还会增加反向边类型

示例:

import torch_geometric.transforms as T

T.ToUndirected()(data)

输出:

HeteroData(
  paper={
    x=[736389, 128],
    year=[736389],
    y=[736389],
    train_mask=[736389],
    val_mask=[736389],
    test_mask=[736389]
  },
  author={ x=[1134649, 128] },
  institution={ x=[8740, 128] },
  field_of_study={ x=[59965, 128] },
  (author, affiliated_with, institution)={ edge_index=[2, 1043998] },
  (author, writes, paper)={ edge_index=[2, 7145660] },
  (paper, cites, paper)={ edge_index=[2, 10792672] },
  (paper, has_topic, field_of_study)={ edge_index=[2, 7505078] },
  (institution, rev_affiliated_with, author)={ edge_index=[2, 1043998] },
  (paper, rev_writes, author)={ edge_index=[2, 7145660] },
  (field_of_study, rev_has_topic, paper)={ edge_index=[2, 7505078] }
)

增加自环:每种边都会加