PyTorch Geometric:from_networkx与group_node_attrs联用报错问题
解决NetworkX转PyTorch Geometric时
group_node_attrs参数报错问题 错误原因
from_networkx的group_node_attrs参数不是用来直接传入特征张量的,它的作用是指定NetworkX图中已存在的节点属性键名,让PyG把这些键对应的属性值合并成x张量。你直接传入特征列表x,因为列表是不可哈希类型,所以触发TypeError: unhashable type: 'list'。
正确实现方式
方式1:先给NetworkX节点添加属性,再用group_node_attrs合并
先将字符串特征转为数值类型,然后把每个节点的特征作为属性添加到NetworkX图中,再指定属性名让PyG合并:
import networkx as nx from torch_geometric.utils.convert import from_networkx import torch nodes= ['1', '5', '28'] edges= [('1', '5'), ('5', '28')] G = nx.DiGraph() G.add_nodes_from(nodes) G.add_edges_from(edges) # 1. 将字符串特征转为float类型的列表 x = [[float(val) for val in row] for row in [ ['0.7844669818878174', '-0.40328940749168396', '-0.9366764426231384'], ['0.14061762392520905', '-1.1449155807495117', '-0.1811756044626236'], ['-1.8840126991271973', '-1.2096494436264038', '1.0780194997787476'] ]] # 2. 给每个节点添加特征属性 for node, feat in zip(nodes, x): G.nodes[node]['feat'] = feat # 给节点添加名为'feat'的属性 # 3. 转换时指定要合并的属性名 pyg_graph = from_networkx(G, group_node_attrs=['feat']) # 此时pyg_graph.x就是合并后的特征张量 print(pyg_graph.x)
方式2:直接转换后设置x张量(更简洁)
如果不需要依赖NetworkX的节点属性,直接转换后手动设置x张量更高效:
import networkx as nx from torch_geometric.utils.convert import from_networkx import torch nodes= ['1', '5', '28'] edges= [('1', '5'), ('5', '28')] G = nx.DiGraph() G.add_nodes_from(nodes) G.add_edges_from(edges) # 转换特征为torch张量 x_tensor = torch.tensor([ [float(val) for val in row] for row in [ ['0.7844669818878174', '-0.40328940749168396', '-0.9366764426231384'], ['0.14061762392520905', '-1.1449155807495117', '-0.1811756044626236'], ['-1.8840126991271973', '-1.2096494436264038', '1.0780194997787476'] ] ], dtype=torch.float) # 先转换图结构 pyg_graph = from_networkx(G) # 手动设置特征张量 pyg_graph.x = x_tensor print(pyg_graph.x)
关键注意点
- 特征必须转换为数值类型(float/int),不能是字符串,否则PyG无法转为张量
group_node_attrs仅用于合并已存在的节点属性,不能直接传入特征数据
内容的提问来源于stack exchange,提问作者Iris
相关产品推荐
相关产品推荐

