使用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
相关产品推荐
相关产品推荐

