第19章 可视化网络架构
我们还没有讨论的一个概念是架构可视化,即构建网络中节点和对应的连接的图表并且将该图表作为一副图像保存到磁盘的过程。图中的节点表示层,节点之间的连接表示数据通过网络的数据流。
在每层中这些图通常包括下述部件:
(1)输入卷大小;
(2)输出卷大小;
(3)可选的层的名字。
我们通常使用网络架构可视化,当(1)调试我们自己的自定义网络架构和(2)出版的时候,这时架构可视化要比源码以及涵盖同样信息的表格更加容易理解。在后续中,将看到如何使用keras构建架构可视化,且将它作为一副图保存到磁盘上。
1 架构可视化的重要性
可视化一个模型的架构是极其重要的一个调试工具,特别是:
(1)在出版物中实现一个架构,但是你对它不熟悉;
(2)实现你自己定义的网络架构。
简短的说,架构可视化验证我们的假设,即代码是否按照我们预定的想法在构建模型。通过检查该输出图,可以检查是否存在逻辑破绽。最常见的破绽包括:
(1)网络中不正确的层顺序;
(2)在一个CONV或POOL层后假设了一个不正确的输出卷大小。
无论什么时候实现一个网络架构的时候,我建议在CONV或POOL层的每一个块之后可视化网络架构,这将验证你的假设(更重要的是在网络早期发现错误)。
CNNs中的bug不像应用程序中由边界条件引起的其它逻辑bug一样。而是,一个CNN可能训练的很好而且即使在不正确的层顺序也获得了合理的结果,但是如果你不能意识到这种错误的发生,你可能报告你的结果认为你做了一件事,实际上你却做了另一件事。在后续中,我将帮助你可视化网络架构来避免这种有问题的情况。
1.1 安装graphviz和pydot
在ubuntu下直接sudo apt-get install graphviz即可安装graphviz包。安装完后需要安装python包:pip install graphviz、pip install pydot。
由于我自己在离线环境中,因此从https://pypi.org/网站下搜索graphviz和pydot,将python离线包下载到dl4cv虚拟环境下,然后解压,直接python set-up.py install即可安装。安装完毕,就可以使用该环境了。
1.2 可视化keras网络
在GitHub的chapter19/下执行文件python visualize_architecture.py即可在当前目录下生成lenet.png文件,该文件记录了网络流。
我们导入需要创建的网络架构以及可视化工具,然后构建模型,将模型可视化然后保存到文件中即可。
执行后的lenet.png即为实际的网络可视化图。打开后将看到下图:
图19.1/19.2 网络可视化架构图
如图19.1和19.2所示的即为MiniVGGNet架构图,架构中的每一个节点表示一层且连接到下一层,终止于softmax分类器。注意网络中的每一层是如何包含输入和输出大小的——这些值对应于卷进入该层和退出该层时空间维度的大小。
漫步在LeNet架构,可看到输入层接受一个为28×28×1的输入图像。该层的输入和输出尺寸是相同的,是由于该层仅是输入数据的占位符。
你可能奇怪数据尺寸(None, 28, 28, 1)中的None值,这个属性表示我们实际的batch size。当可视化网络架构时,keras不知道我们实际的batch size,因此置为None。在实际训练时,我们可以设置为32、64、128等等任意我们确实合适的batch size。
下一步,我们的数据进入第一个CONV层,该层在输入28×28×1上学习到20个核。第一个CONV的输出为28×28×20,由于使用了zero padding我们保留了最初的输入尺寸,但是通过学习20个核我们也改变了它的尺寸。
CONV层之后是激活层,按照定义该层不会改变输入卷大小。但是一个POOL层会改变输入卷大小,这里输入卷尺寸从28×28×20降为14×14×20。
第二个CONV层接受14×14×20的输入卷大小,但是通过学习50个核使得输出卷大小为14×14×50。然后经过激活层、POOL层后输出卷更改为7×7×50。
此时,我们应用FC层,为了完成它,7×7×50的输入变为2450的列表(因为7*7*50=2450)。既然我们将网络的卷积部分的输出flattened了,那么我们可以接受2450的输入大小且学习500个节点来应用FC层。然后跟着激活层,之后再应用另一个FC层,这次将500输入将为10(即我们MNIST数据集的类别标签的总数目)。
最后,一个softmax分类器将应用在这10个输出上,给出我们最终的类别概率。
2 总结
就像我们可以用代码表达LeNet架构,我们也可以用图来可视化模型本身。随着你开始深度学习的旅行,我强烈建议你使用这段代码来可视化任何你的网络架构,特别是在你不熟悉它的时候。确保你理解了网络中的数据流并且理解在CONV、POOL和FC层之后的卷大小是如何改变的,这将使你对架构有更深入的理解而不是仅依赖代码本身。
当实现我自己的网络架构的时候,随着我在实际编码的时候,我每2-3层块结构时,我就会可视化网络架构,确保我及早发现bug以及逻辑破绽。
原文地址:https://www.cnblogs.com/paladinzxl/p/9686041.html