如何可视化带有已训练权重的Keras神经网络?
提问内容翻译
我使用keras库搭建了如下的Sequential序列模型:
from keras.layers import Dense from keras.models import Sequential model = Sequential() # 加入输入层和第一个隐藏层 model.add(Dense(6, activation='relu',input_dim = 11)) # 加入第二个隐藏层(实际模型包含更多隐藏层) model.add(Dense(6,activation='relu')) # 加入输出层 model.add(Dense( 1, activation = 'sigmoid'))
之后我用keras visualizer实现了不带权重的神经网络可视化,模型的编译与训练代码如下:
# 编译ANN classifier.compile(optimizer = 'Adamax', loss = 'binary_crossentropy',metrics=['accuracy']) model_history=classifier.fit(X_train, y_train.to_numpy(), batch_size = 10, epochs = 100)
我希望能在这类可视化结果中展示模型的已训练权重,请问有可使用的相关库或模块吗?任何建议都十分有帮助。下方是当前未展示权重的神经网络设计示意图:
回答
以下是几个可直接落地的实现方案:
- 方案1:使用Netron工具
这是门槛最低的方案,训练完成后将模型保存为.h5或.keras格式,直接用Netron打开模型文件即可,默认会展示所有层的结构、权重、偏置的具体数值,还支持单独筛选查看某一层的参数明细,不需要额外写代码。 - 方案2:基于visualkeras自定义标注权重
你可以先提取模型各层的权重参数,再在visualkeras生成的基础结构图上叠加权重标注,也可以根据权重大小调整层间连线的粗细,直观展示参数差异,参考代码如下:import visualkeras from PIL import ImageDraw, ImageFont # 生成基础网络结构图 img = visualkeras.layered_view(model, scale_xy=1, scale_z=1, legend=True) draw = ImageDraw.Draw(img) # 自定义加载字体,也可以直接用默认字体 font = ImageFont.load_default(size=14) # 示例:提取第一层权重并标注 first_layer_weights = model.layers[0].get_weights()[0] # 坐标可根据你生成的图的尺寸自行调整 draw.text((40, 40), f"第一层平均权重: {first_layer_weights.mean():.2f}", font=font, fill="black") # 也可以循环读取所有层的权重,逐行标注 for idx, layer in enumerate(model.layers): w = layer.get_weights()[0] draw.text((40, 40 + idx*20), f"层{idx+1} 权重范围: [{w.min():.2f}, {w.max():.2f}]", font=font, fill="black") img.save("model_with_weights.png") - 方案3:用Matplotlib完全自定义绘制
如果需要高度定制可视化效果,可以手动读取每层的权重和偏置,自行绘制节点和连线,用连线的粗细、颜色区分权重的大小和正负,也可以直接把权重数值标注在连线旁边,适配特殊的展示需求。
内容的提问来源于stack exchange,提问作者Angiyo
相关产品推荐
相关产品推荐

