You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NetworkX可视化神经网络前向传播时遇ValueError求助

NetworkX绘制神经网络报错:ValueError: all nodes must have subset_key (default='subset') as data

我想用NetworkX包可视化神经网络前向传播逻辑,将各层表示为节点子集,但运行代码时出现如下错误:

ValueError: all nodes must have subset_key (default='subset') as data

附上绘图部分代码,求修改建议或解决方案:

# Create a graph object
G = nx.DiGraph()

# Adding nodes & edges
G.add_nodes_from(['Input Layer'] + ['Hidden Layer ' + str(i) for i in range(1, hidden_size+1)] + ['Output Layer'])

for i in range(input_size):
    G.add_edge('Input Layer', 'Hidden Layer 1', weight=weights_hidden[i][0])
for i in range(hidden_size):
    if i < hidden_size-1:
        G.add_edge('Hidden Layer ' + str(i+1), 'Hidden Layer ' + str(i+2), weight=weights_hidden[:, i+1])
    G.add_edge('Hidden Layer ' + str(i+1), 'Output Layer', weight=weights_output[i])

# Set positions for nodes
pos = nx.multipartite_layout(G, subset_key='subset')
nx.draw_networkx_nodes(G, pos, node_color='lightblue', node_size=500, alpha=0.8)

edge_labels = {(u, v): round(d['weight'], 2) for u, v, d in G.edges(data=True)}
nx.draw_networkx_edges(G, pos, width=2, alpha=0.8, arrows=True)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8)

node_labels = {node: node for node in G.nodes}
nx.draw_networkx_labels(G, pos, node_labels, font_size=10, font_weight='bold')

plt.axis('off')

# plotting
plt.title('Feed-forward Neural Network Architecture')
plt.tight_layout()
plt.show()

错误原因

multipartite_layout函数要求图中所有节点都必须包含subset属性(或指定的subset_key对应的属性),用来区分节点所属的子集(即神经网络的不同层),但你当前添加节点时没有为任何节点设置该属性,因此触发报错。

修改方案

修改节点添加逻辑,为每个节点指定对应的subset属性,数值代表节点所在的层级顺序(数值越小,布局时越靠前):

# Create a graph object
G = nx.DiGraph()

# 修改节点添加逻辑,为每个节点设置subset属性
layers = [
    # (节点名称, 所属层级subset值)
    ('Input Layer', 0),
    *[('Hidden Layer ' + str(i), i) for i in range(1, hidden_size+1)],
    ('Output Layer', hidden_size + 1)
]
for node, subset_val in layers:
    G.add_node(node, subset=subset_val)

# 添加边的逻辑保持不变
for i in range(input_size):
    G.add_edge('Input Layer', 'Hidden Layer 1', weight=weights_hidden[i][0])
for i in range(hidden_size):
    if i < hidden_size-1:
        G.add_edge('Hidden Layer ' + str(i+1), 'Hidden Layer ' + str(i+2), weight=weights_hidden[:, i+1])
    G.add_edge('Hidden Layer ' + str(i+1), 'Output Layer', weight=weights_output[i])

# 后续绘图代码保持不变
pos = nx.multipartite_layout(G, subset_key='subset')
nx.draw_networkx_nodes(G, pos, node_color='lightblue', node_size=500, alpha=0.8)

edge_labels = {(u, v): round(d['weight'], 2) for u, v, d in G.edges(data=True)}
nx.draw_networkx_edges(G, pos, width=2, alpha=0.8, arrows=True)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8)

node_labels = {node: node for node in G.nodes}
nx.draw_networkx_labels(G, pos, node_labels, font_size=10, font_weight='bold')

plt.axis('off')

plt.title('Feed-forward Neural Network Architecture')
plt.tight_layout()
plt.show()

说明

  • subset属性的数值决定了节点在布局中的顺序,输入层设为0,隐藏层依次递增,输出层设为隐藏层数量+1,符合神经网络从输入到输出的流向。
  • 修改后multipartite_layout可以正确识别各层节点,生成分层的布局效果。

内容的提问来源于stack exchange,提问作者user13871772

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:42:50