Caffe实战(七):caffe可视化工具
1. 数据可视化
在使用caffe进行图像分类,所有数据在预处理时都经历了从图像数据(二进制图像文件如MNIST/CIFAR10,图像格式文件JPEG/PNG)到caffe数据库(LMDB/LEVELDB)的转换,这样做可以提高数据I/O速率,但代价是,开发者无法直接看到数据。
通过数据可视化,可以让设计者快速熟悉数据,并根据数据特点设计模型,有助于调试算法、提纯数据。数据是深度学习最重要的信息源,获取高质量的数据往往比设计复杂的模型更有效。
2. 网络结构可视化
在Caffe中,目前有两种可视化prototxt格式网络结构的方法:
- 使用Netscope在线可视化
- 使用Caffe提供的draw_net.py
使用Netscope绘制出的图直观简洁,易于快速了解网络模型,但是缺少层内的细节信息;
使用draw_net.py绘制出的结构图保存了参数信息,细节更丰富,但是结构不是很清晰明了,这一点在大型模型上的体现尤为明显。
1.1 在线可视化工具
深度学习网络结构画图工具(写文章,画图可参考)
类似这种
Netscope:caffe网络结构在线可视化工具
Netscope是一个支持prototxt格式描述的神经网络结构的在线可视工具,网址:http://ethereon.github.io/netscope/quickstart.html
它可以用来可视化Caffe结构里prototxt格式的网络结构,支持从GitHub Gist或者编辑器中可视化Caffe的网络结构。
使用起来也非常简单,打开这个地址,点击Launch Editor,把你的描述神经网络结构的prototxt文件内容复制到编辑框里(左侧),按shift+enter,就可以直接以图形方式显示网络的结构。
Netron网络结构在线可视化工具
支持多种模型的可视化,包括caffe,tensorflow, ONNX等等.
神经网络训练可视化
这个网站可以十分清晰的看到神经网络的训练与工作过程,而且该工具支持删除和添加神经元、隐藏层,能够调节训练集的比例。
卷积神经网络可视化
这个网站是CS231n的讲师karpathy做的一个网站,里面有好多有意思的东西。其中包括CIFAR-10数据集的训练过程,可以可是化的看到每一层卷积处理过的图
网站地址:http://cs.stanford.edu/people/karpathy/ (karpathy的个人网站)
LeNet网络结构可视化
这个网站做了一个手写数字识别的可视化,效果不错。
深度学习可视化工具Visual DL
Visual DL是百度开发的,基于echar和PaddlePaddle,支持PaddlePaddle,PyTorch和MXNet等主流框架。可惜不支持caffe和tensorflow。
结构可视化工具PlotNeuralNet
萨尔大学计算机科学专业的一个学生开发。
CNN Explainer(功能化很强大,能够看到每个卷积核处理过程)
CNN Explainer 使用 TensorFlow.js 加载预训练模型进行可视化效果,交互方面则使用 Svelte 作为框架并使用 D3.js 进行可视化。
1.2 使用caffe自带的python/draw_net.py绘制网络模型工具
python/draw_net.py用来绘制网络模型的。在绘制之前,生成caffe的python接口(pycaffe),并需要安装两个库:GraphViz和pydot。
Graphviz是贝尔实验室开发的一个开源的可视化软件,能够以抽象的图和网络表示结构信息,支持多种格式输出,如各种常见的图片格式(bmp、png等),PDF,SVG等,广泛使用于网络,生物信息学,软件工程等领域。Graphviz使用dot作为脚本语言,只需要在dot脚本中定义图的顶点和边,以及形状、颜色、字体、填充等样式,Graphviz就可以使用合适的布局算法对图形布局,使各顶点均匀分布在画布上,并且尽可能的减少边的交叉。
下载地址: http://www.graphviz.org/
pydot模块提供了python对graphviz dot语言的接口,使在python下可以调用graphviz工具绘图。
Linux平台操作说明
在Linux平台上编译pycaffe可以参考 Caffe实战(四):pycaffe和matcaffe接口编译
安装graphviz和pydot都比较简单,网上也有很多资料可以参考。下面以在ubuntu上的安装操作进行介绍(还未验证)
【安装可视化软件包】
安装GraphViz
# sudo apt-get install GraphViz
注意,这里用的是apt-get来安装,而不是pip.
安装pydot # sudo pip install pydot 用的是pip来安装,而不是apt-get
【可视化工具:draw_net.py】
draw_net.py执行的时候带三个参数:
- 第一个参数:网络模型的prototxt文件
- 第二个参数:保存的图片路径及名字
- 第二个参数:--rankdir=x , x 有四种选项,分别是LR, RL, TB, BT 。用来表示网络的方向,分别是从左到右,从右到左,从上到小,从下到上。默认为LR。
例如绘制lenet网络模型
python python/draw_net.py examples/mnist/lenet_train_test.prototxt netImage/lenet.png --rankdir=BT
Windows平台操作说明
windows平台下的操作比较复杂,而且还有很多的坑,尤其是版本不一致时,遇到各种问题。
关于windous平台编译pycaffe的方法参考: Caffe实战(四):pycaffe和matcaffe接口编译
【安装可视化工具依赖包】
情形一:安装了anaconda for python2.7
此时不能直接运行cmd窗口,因为这样调出来的是电脑单独安装的python版本(我的系统安装的是python3.6)
此时需要打开anaconda prompt窗口(可以可以看做是cmd窗口),这里才是python2.7环境。
conda install pydot-ng conda install graphviz
情形二:电脑安装了python2.7
下载GraphViz windows版本,安装之后记得将.../bin目录添加到环境变量里,让系统可以找到graphviz的相关文件。
#安装pydot pip install pydot #安装protobuf pip install protobuf #安装scikit-image pip install scikit-image #安装sciphy pip install scipy
这里特别要注意的是,先安装GraphViz,并添加环境变量,然后在安装pydot,否则会提示“dot”not found in path 的问题。
【可视化工具:draw_net.py】
同样分两种情况:
- 如果安装了anaconda,则在anaconda prompt窗口执行;
- 如果安装了python2.7,则在cmd窗口内执行。
#编写一个cmd脚本
python python/draw_net.py examples/mnist/lenet_train_test.prototxt netImage/lenet.png --rankdir=BT
只要记住一点:哪个里面有python2.7环境,在哪个里面执行。
3. 网络权值可视化
判断模型优劣的第二种方法是对训练后的模型权值进行可视化。
卷积层权值可视化十分有用,因为经过良好训练的网络权值通常表现为美观、光滑的滤波器;反之,如果表现为噪声图样,则可能意味着网络还没有经过足够长时间的训练,或者由于正则化强度过小导致网格出现过拟合。通常第一个卷积层是最容易解释额,因为它直接“看”原始像素。
由于需要获得网络模型以及网络权值参数等信息,需要提供matlab接口的caffe,即编译生成matcaffe。编译matcaffe接口的操作参考:Caffe实战(四):pycaffe和matcaffe接口编译
4. 特征图可视化
可视化网络在前向传播阶段的各层的响应,这样可以很容易看出危险的错误信号,比如对于多个不同的输入,一些响应特征图全为零,于是可以检测“死”滤波器,可能是学习速率过高的症状。
通过观察每层的响应特征图,可以判断模型的结构设计(如每层通道数目)是否合理,如果大量的响应特征图都重复出现或全为接近0的值,则可以减少通道数以提高网络效率。
一般情况:底层响应特征图关注图像中不同细节(背景或主体的纹理或轮廓),而高维响应特征图变得局部且稀疏,用于剔除不相关内容并提取目标重要的特征。
参考资料