Keras Python 深度学习库提供了可视化和更好地理解神经网络模型的工具。
在本教程中,您将确切地了解如何在 Keras 中总结和可视化深度学习模型。
完成本教程后,您将了解:
- 如何创建深度学习模型的文本摘要。
- 如何创建深度学习模型的图表。
- 在 Keras 中开发深度学习模型的最佳实践技巧。
通过我的新书《Python 深度学习》,以分步教程和所有示例的Python 源代码文件开始您的项目。
让我们开始吧。

如何在 Keras 中可视化深度学习神经网络模型
照片由 Ed Dunens 提供,保留部分权利。
教程概述
本教程分为4个部分,它们是:
- 示例模型
- 总结模型
- 可视化模型
- 最佳实践技巧
示例模型
我们可以从定义一个简单的 Keras 多层感知器模型开始,该模型可用于摘要和可视化。
我们将定义的模型有一个输入变量,一个带有两个神经元的隐藏层,以及一个带有单个二进制输出的输出层。
例如
1 |
[1 输入] -> [2 神经元] -> [1 输出] |
如果您是Keras或深度学习的新手,请参阅此分步Keras教程。
此网络的代码列表如下所示。
1 2 3 4 5 |
from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(2, input_dim=1, activation='relu')) model.add(Dense(1, activation='sigmoid')) |
总结模型
Keras 提供了一种总结模型的方法。
摘要是文本形式的,包含有关以下信息:
- 模型中的层及其顺序。
- 每层的输出形状。
- 每层的参数(权重)数量。
- 模型中的总参数(权重)数量。
可以通过在模型上调用 `summary()` 函数来创建摘要,该函数返回一个字符串,然后可以打印该字符串。
下面是打印创建模型摘要的更新示例。
1 2 3 4 5 6 |
from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(2, input_dim=1, activation='relu')) model.add(Dense(1, activation='sigmoid')) print(model.summary()) |
运行此示例将打印下表。
1 2 3 4 5 6 7 8 9 10 11 |
_________________________________________________________________ 层(类型) 输出形状 参数数量 ================================================================= dense_1 (Dense) (None, 2) 4 _________________________________________________________________ dense_2 (Dense) (None, 1) 3 ================================================================= 总参数:7 可训练参数:7 不可训练参数: 0 _________________________________________________________________ |
我们可以清楚地看到每层的输出形状和权重数量。
可视化模型
摘要对于简单模型很有用,但对于具有多个输入或输出的模型可能会令人困惑。
Keras 还提供了一个创建网络神经网络图的函数,这可以使更复杂的模型更容易理解。
Keras 中的 `plot_model()` 函数将创建网络图。此函数接受几个有用的参数:
- model:(必需) 您要绘制的模型。
- to_file:(必需) 要将图保存到的文件名。
- show_shapes:(可选,默认为 `False`) 是否显示每层的输出形状。
- show_layer_names:(可选,默认为 `True`) 是否显示每层的名称。
下面是绘制创建模型的更新示例。
注意,该示例假定您已安装 Graphviz 图形库和 Python 接口。
1 2 3 4 5 6 7 |
from keras.models import Sequential from keras.layers import Dense from keras.utils.vis_utils import plot_model model = Sequential() model.add(Dense(2, input_dim=1, activation='relu')) model.add(Dense(1, activation='sigmoid')) plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True) |
运行该示例将创建文件 `model_plot.png`,其中包含创建模型的图。

神经网络模型图
最佳实践技巧
我通常建议始终在 Keras 中创建神经网络模型的摘要和图。
我推荐这样做有几个原因:
- 确认层顺序。使用序列 API 很容易将层以错误的顺序添加,或者使用函数式 API 将它们错误地连接在一起。图表可以帮助您确认模型的连接方式是否符合您的意图。
- 确认每层的输出形状。在为卷积神经网络和循环神经网络等复杂网络定义输入数据形状时,通常会遇到问题。摘要和图表可以帮助您确认网络输入形状是否符合您的意图。
- 确认参数。某些网络配置可以使用更少的参数,例如在编码器-解码器循环神经网络中使用 `TimeDistributed` 包装的 `Dense` 层。查看摘要有助于发现使用参数比预期多得多的情况。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在本教程中,您了解了如何在 Keras 中总结和可视化深度学习模型。
具体来说,你学到了:
- 如何创建深度学习模型的文本摘要。
- 如何创建深度学习模型的图表。
- 在 Keras 中开发深度学习模型的最佳实践技巧。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
运行 plot_model 时出现错误。
它无法导入 pydot。
我已经安装并尝试过了。
没有任何改善。
是什么错误?
我收到这个:
AttributeError:'module' object has no attribute 'find_graphviz'
您可能需要安装两个包:pydot 和 pygraphviz。
如果您使用的是 conda 环境,那么这可能会起作用。
!conda install –yes graphviz
!conda install –yes pydotplus
感谢分享,Shantanu。
我遇到了同样的问题。
它显示“ImportError: Failed to import pydot. You must install pydot and graphviz for
pydotprint
to work。” 即使我已经安装了 graphviz 和 pydot 或 pydotplus。您必须安装 pydot 和 pygraphviz。
您也可以尝试将 graphviz 文件夹添加到系统路径。这对我有效。
如果您遇到错误,99% 的原因是您没有将 `/graphviz/bin/` 文件路径添加到您的 PATH。 `pip install graphviz` 并不足够。您需要将其文件添加到 PATH。
感谢分享。
如何在 Linux 中添加到路径
嗨 Jason,您还可以包含一个关于 TensorBoard 的教程,其中每次运行模型时,我们都可以使用回调函数将其记录下来,并在 TensorBoard 上显示所有运行。
感谢您的建议。
谢谢 Jason Brownlee 的帮助……愿上帝保佑你
不客气。
所有的打印输出都不包含激活函数,我认为这在使用中很重要!……
说得好。
看看这个项目以获得更好的可视化效果
https://github.com/yu4u/convnet-drawer
你用过它吗?
就其他类型的层而言,密集层是什么意思?
另一个问题,同一层中的所有神经元都会使用相同的激活函数吗?
层中的所有神经元确实使用相同的激活函数。
你好,我遇到了这个错误:“raise ImportError(‘Failed to import pydot. You must install pydot’
ImportError: Failed to import pydot. You must install pydot and graphviz for
pydotprint
to work。”我已经通过“sudo pip install **”安装了 pydot 和 graphviz,但问题仍然没有解决。我能得到一个评论吗?
谢谢你
我建议安装 pygraphviz 而不是 graphviz。
我目前正在努力适应 Keras。我认为我需要收集导入图像数据等示例。此外,到目前为止我只理解基本神经网络,我需要进一步学习如何使用 Keras 创建卷积网络。最后,我不确定网络如何同时处理图像批次。
我计划使用此仓库与 Keras 结合:github.com/diginessforever/machinelearning -> 它已经有一个漂亮的网页抓取器和我的一些菜鸟神经网络代码。
太棒了,感谢分享。祝你好运!
我们可以在 TensorBoard 中可视化模型吗?
我相信可以。抱歉,我没有教程。
Jason,真的没弄好。我已经通过 conda 和 python – m pip 命令都安装了 pydot、pygraphviz 和 gpraphviz,但仍然是相同的消息。有什么诀窍?如果您能按顺序指定命令可能会有帮助。提前感谢。
没有特别的诀窍,我只是 pip 安装了这两个库。
也许可以尝试在 stackoverflow.com 上发布/搜索您的错误?
嗨 Jason,很酷的教程!你能否将其扩展到一个具有多个输入的模型?不用复杂,也许一个输入 a 的 Dense 层,一个输入 b 的 Dense 层,将它们合并,映射到一些类,完成。提前感谢。
这里有一些例子
https://machinelearning.org.cn/keras-functional-api-deep-learning/
对于 Keras 的训练目的,我们需要显式配置使用 GPU 吗?还是它会自动使用 GPU?
您必须配置后端(例如 TensorFlow 等)来使用 GPU。如果配置了,Keras 就会使用 GPU。
ImportError: Failed to import pydot. You must install pydot and graphviz for
pydotprint
to work。我已经通过 conda install pydot 和 conda install graphivz 安装了 pydot 和 graphviz,
但仍然收到此错误?
很遗憾听到这个消息。也许可以把错误发布到 stackoverflow 上?
你好,Jason。
在 Stack Overflow 上查找时,我发现以下错误实际上是 Keras 中的一个 bug,很多人都有,即使安装了这两个库也无法修复。
ImportError: Failed to import pydot. You must install pydot and graphviz for pydotprint to work.
Apparently there is no way to solve this to this day. Is there any other trick to visualize the model? Thanks.
没有诀窍。我安装了库并编写/运行了代码。
你好 Jason,
我使用了您的代码来绘制相同的模型。我遇到了一个问题,图片没有输入
层。相反,它显示了数字,例如 140223915681232。您以前遇到过同样的问题吗?
是的。
我没见过那个,这可能是一个 bug?您可以尝试向 Keras GitHub 项目的问题部分发布?
我也遇到了同样的问题
您必须更新您的 Keras 版本。
嗨,Jason,我在网络中使用了 conv3d 层,因为我的数据集是 3D 的。现在我想绘制中间层的特征。过程是什么,我如何可视化 3D 数据集中中间层的特征图?应该使用哪个库?
抱歉,我没有可视化 CNN 中特征图的示例。
打印输出中的“None”值是什么意思?
很好的问题!
它表示“未指定”,并且它会随着输入的大小而变化。
感谢您提供此教程以及所有其他深度学习教程。您是最好的!
不客气,很高兴能帮到您。
我的模型是这样的:
model = Sequential()
model.add(LSTM(214,return_sequences= True, activation=’relu’, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(LSTM(204, activation= ‘relu’))
model.add(Dense(n_prediction))
如果我运行 plot_model 函数,我会得到一张像上面展示的图片,但我的第一个输入是一个带有巨大数字 732677288 的框。
这是什么意思?
有没有可能打印出网络图,以便我更好地理解 LSTM 层?
我也看到了这个,这可能是 Keras 最新版本的一个缺陷。
我这里也有同样的问题。这是已确认的 bug 吗?我在网上找不到任何信息。
尝试更新到 Keras 2.2.2。
R Keras 中有类似的功能吗?
谢谢你
我不知道,抱歉。
嗨,Jason,
感谢您的精彩帖子。
一个问题:我的 plot_model 命令生成了一个文件,但没有在 Jupyter Notebook 中显示它。
我知道有一个命令(%matplotlib inline)可以在 Jupyter 中显示 matplotlib 图像。是否有类似的命令来显示 plot_model 的输出?
谢谢
Ajit
我建议从命令行运行代码,它总是有效的!
嗨,Jason,
又一篇很棒的文章!
以下将不会打印激活层。
model.add(Dense(2, input_dim=1, activation=’relu’))
print (model.summary())
但是,如果逐个添加,激活层就会被打印出来,如下所示:
model.add(Dense(2, input_dim=1))
model.add(Activation('relu'))
print (model.summary())
你知道为什么吗?
此致
是的,一种情况是它是层的一部分,另一种情况是它被实现为一个层。
模型是不同的,这是一个设计决策,在这种情况下它们在功能上是等效的。但这并不总是成立的。
Jason,是时候写一篇关于 Tensorboard 的教程了?继续做好工作!
感谢您的建议。
Jason,好帖子!谢谢。
我非常感谢关于 summary 和 model_plot 函数的这个特别的技巧
“在为像卷积神经网络和循环神经网络这样的复杂网络定义输入数据形状时,通常会遇到问题。summary 和 plot 可以帮助您确认网络的输入形状是否如您所愿”。
因为在匹配输入-输出维度以及使用重塑(reshaping)来处理训练数据形状、输入形状参数、卷积特有的形状处理等方面时,很容易出错和混淆……对于不同的层和模型
是的,这可能是关于神经网络配置最常见的问题(尺寸不匹配问题)!
你太棒了!!!!
我过去20年一直在阅读各种博客,但你的博客无疑是最好的。
谢谢。
非常棒的教程!
有没有办法“反向”做这件事?例如,对于一个有10个输出类的分类 CNN,你可以“刺激”其中一个输出,看看过滤器是如何产生它的?
我不确定我是否理解,你能详细说明一下吗?
抱歉,我会尽量说得更清楚一些。这里的可视化显示了当你向 CNN 输入一张鸟的图片时,各层的激活情况,最终分类为“知更鸟”。我们看到,在从“这张鸟的图片”到“知更鸟分类”的过程中,各个层对图像的哪些部分感兴趣。
我的问题与反向操作有关。如果我们有相同的 CNN,是否有办法使用它(或它的修改版本)来查看哪些过滤器对于“知更鸟”分类相对于其他分类来说更重要或更不重要?
这听起来是个相当难的问题。我一时之间想不到一个清晰的方法。
也许有什么聪明的工程师已经想出了方法,我很抱歉我不知道。
ValueError: Error when checking input: expected conv2d_3_input to have shape (966, 1296, 3) but got array with shape (966, 1296, 1)
先生,我在执行 model.fit 时遇到这个错误
我还有另一个疑问,就是我们是否只能使用一张图片数据和标签来训练我们的模型?
错误表明您的数据形状和模型之间存在不匹配。
您可以重塑您的数据或更改您模型的预期。
嗨,Jason,
又一篇很棒的文章!
你能研究一下如何可视化 LSTM 单元状态的变化吗?
谢谢!
谢谢。
有趣的建议。
你为什么对 LSTM 状态的变化感兴趣?
嗨,Jason,
又一个很棒的教程!
是否可以保存/捕获模型使用的优化器和损失函数?
谢谢!
你具体指的是什么?
因为模型架构(层)可以保存为图像。但这不包含关于优化器和损失函数(在 compile 函数中使用)的信息。有什么方法可以从模型中检索这些信息吗?
我明白了,好问题。
我暂时不确定,也许可以试试发布到 keras 用户组
https://machinelearning.org.cn/get-help-with-keras/
好看。
我正在寻找一种可视化模型的方法,以便能够向学生解释清楚。
我记得在 torch7 中做过这件事,这是教授这些东西最简单的方法。
不幸的是,lua 的开发停滞了
谢谢。
也许你可以转向 pytorch
https://machinelearning.org.cn/pytorch-tutorial-develop-deep-learning-models/
很棒的教程!
在构建 DNN 或 CNN 模型、选择 Dropout 率、Epoch 数量、Batch size、每个隐藏层中的隐藏神经元数量后,如何将结果与科学依据联系起来?
换句话说:我该如何解释和讨论结果?
结果只能提供经验证据,即使那样,通常也是相对于您在同一测试框架上明确测试过的其他模型而言,即相对改进。
在应用机器学习中,这通常是我们能做的最好的。
我已经安装了两个必需的库。我假设代码会弹出一个窗口显示可视化模型,对吗?如果是,我就没有看到那个窗口。我需要添加一些“import”行吗?
顺便说一句,我手动打开了 png 文件。
我相信图像是保存到文件,而不是弹出。
OSError:
pydot
failed to call GraphViz.Please install GraphViz (https://graphviz.cn/) and ensure that its executables are in the $PATH.我已经安装了 GraphViz 和 pydot。
同时安装 pygraphviz 和 pydot。
我没有找到“none”,它变成了一个“?”
是的,它意味着无界(not bounded)。
AttributeError Traceback (最近一次调用)
in
41
42 Model.summary()
—> 43 plot_model(model, to_file=’model_plot.png’,show_shapes=True, show_layer_names=True)
~/anaconda3/lib/python3.7/site-packages/keras/utils/vis_utils.py in plot_model(model, to_file, show_shapes, show_layer_names, rankdir, expand_nested, dpi)
238 “””
239 dot = model_to_dot(model, show_shapes, show_layer_names, rankdir,
–> 240 expand_nested, dpi)
241 _, extension = os.path.splitext(to_file)
242 if not extension
~/anaconda3/lib/python3.7/site-packages/keras/utils/vis_utils.py in model_to_dot(model, show_shapes, show_layer_names, rankdir, expand_nested, dpi, subgraph)
97 if not model.built
98 model.build()
—> 99 layers = model._layers
100
101 # Create graph nodes.
AttributeError: ‘XGBRegressor’ object has no attribute ‘_layers’
看起来您正在将代码应用于 xgboost 模型,这是无效的。
我在使用 pydot 和 graphviz 时遇到了上面提到的相同问题。
我设法在 Google Colab 中解决了这个问题,但不确定具体原因,但对我来说是有效的。
希望这对遇到同样问题的人有所帮助。
也许可以注释掉对 plot_model 的调用。
在“Output Shape”列下的最后一个数字,是该层中的节点/神经元数量吗?
是的。(None,2) 表示该层的输出中有 2 个神经元。None 只是样本数量的占位符,因为神经网络对输入批次进行操作。
谢谢,解释得很清楚,但是图中的(None)是什么意思?
绘图不起作用,因为 Python 库是一个不断变化的噩梦。下次您写文章时,请写一篇关于健壮(ROBUST)的内容,或者浪费大量时间不断更新您的文章,提供您要求的读者需要经历的安装地狱的最新说明。
这让我想起我在哈佛上的第一门数据科学课:50%的课堂时间都花在了调试安装噩梦上。
你好 Jeff…感谢您的反馈!请告知您遇到的问题,包括错误消息的确切措辞,以便我们更好地指导您。
在可视化模型时,我收到一个错误
ModuleNotFoundError: No module named ‘keras.utils.vis_utils’
有人能帮忙吗?
你好 Magdy…这里有一些很棒的建议
https://stackoverflow.com/questions/43511819/importerror-no-module-named-keras-utils-visualize-util
你好 James,谢谢回复
我正在实施那里的建议,但仍然遇到同样的问题
这是我的代码部分”
#NN 模型可视化
from keras.utils.vis_utils import plot_model
plot_model(model, show_shapes=True, show_layer_names=True, show_dtype=True,show_layer_activations=True)