"\u003Cdiv\u003E\u003Cp\u003E作者 | 言有三\u003C\u002Fp\u003E\u003Cp\u003E编辑 | 言有三\u003C\u002Fp\u003E\u003Cp\u003E大家最诟病深度学习的一点就是理论基础不够系统,模型就像一个黑盒子,这就更加凸显了深度学习模型可视化的重要性了。\u003C\u002Fp\u003E\u003Cp\u003E本文以实战经验为主,除去数据的可视化部分,我们说以下几个主要的方向(1)模型结构的可视化(2)卷积参数的可视化(3)激活区域的可视化(4)训练过程的可视化。\u003C\u002Fp\u003E\u003Ch1\u003E1 \u003Cstrong\u003E模型结构的可视化\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E所谓模型结构的可视化,就是为了方便更直观的看到模型的结构,从而方便进行调试,下面对2个主流的框架进行展示。\u003C\u002Fp\u003E\u003Cp\u003E1.1 caffe网络结构可视化\u003C\u002Fp\u003E\u003Cp\u003E定义一个简单的3层的模型(模型可以查看我们git,代码太长此处不展示),我们可以采用几种方案进行可视化;第一种,利用caffe自带的可视化方法;第二种,利用开源项目netscope;由于netscope可视化效果更好,因此我们采用netscope进行可视化,工具网址如下:http:\u002F\u002Fethereon.github.io\u002Fnetscope\u002F#\u002Feditor\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F4b0ebd01f42d4e19bc97849880ea6ddb\" img_width=\"440\" img_height=\"1128\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E可视化后的结果如上图,可以看到网络的结构是通过卷积+激活函数的堆叠,同时网络的数据输入层和最后的全连接层作为了loss层和acc层的输入。\u003C\u002Fp\u003E\u003Cp\u003E当我们想要看每一层的参数时,就可以将鼠标放上相应的结构块;\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F3089b8bfb81146038f064e058265a834\" img_width=\"978\" img_height=\"1128\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E当然,还可以使用caffe自带的脚本进行可视化,在caffe根目录下的python目录下有draw_net.py这个脚本。\u003C\u002Fp\u003E\u003Cp\u003Edraw_net.py执行的时候带三个参数,第一个参数是网络模型的prototxt文件,第二个参数是保存的图片路径及名字,第三个参数是rankdirx,他有四种选项,分别是LR, RL, TB, BT。用来表示网络的方向,分别是从左到右,从右到左,从上到小,从下到上。默认为LR。\u003C\u002Fp\u003E\u003Cp\u003E1.2 tensorflow网络结构可视化\u003C\u002Fp\u003E\u003Cp\u003E在tensorflow中要进行可视化,必须使用name scope来确定模块的作用范围,添加部分名称和作用域,否则网络图会非常复杂。与上面类似,我们同样定义一个三层的卷积网络(代码还是看git)。\u003C\u002Fp\u003E\u003Cp\u003E要想利用tensorboard进行可视化,必须在session中通过summary存储网络图,只需要在训练代码中添加命令即可,summary = tf.summary.FileWriter(\"output\", sess.graph)\u003C\u002Fp\u003E\u003Cp\u003E最后利用tensorboard命令来查看训练结果和可视化结果,网络的可视化结果如下。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fc12e385b405247b4b755eb60904e3421\" img_width=\"329\" img_height=\"1054\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E可以看出,网络的结构可视化和caffe的差不多。除了caffe的网络结构可视化是输入模型配置文件,大部分的深度学习框架都使用了python进行开发,模型结构的可视化与tensorflow结果差不多。相比较来说,caffe的模型可视化方法更加简单直接,独立于代码,可以更便捷地看到每一层的参数配置。\u003C\u002Fp\u003E\u003Ch1\u003E\u003Cstrong\u003E2 卷积参数可视化\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E前面我们可视化了网络的结构,从而对要训练的网络就有了整体的把握。当我们得到了训练结果之后,一个模型常有百万千万级别的参数,我们能否通过可视化的方法,来评判一下这个网络结构的好坏呢?通常情况下,我们希望网络结构学习到的权重,模式足够丰富,这样才有强大的表征能力。\u003C\u002Fp\u003E\u003Cp\u003E2.1 浅层卷积参数可视化\u003C\u002Fp\u003E\u003Cp\u003E网络的早期卷积学习到的是通用的特征,由于大部分网络的输入都是彩色图,所以数据层的通道数为3。正好我们平时用的彩色图的通道就是3维,这时候如果直接将这3组通道转换为一个彩色图,我们就可以很直观的可视化这第一层的卷积参数,对于任意以输入图为3通道彩色图的网络结构来说,这都是通用的。\u003C\u002Fp\u003E\u003Cp\u003E下面是alexnet学习到的权重的第一层卷积的可视化。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002Fffbc217dd22245988b07fccfd07c9352\" img_width=\"700\" img_height=\"668\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这其中有一些卷积核为灰度图,说明三个通道的对应参数相近,学习到的是与颜色无关的特征。有的为彩色图,说明3个通道的特征差异大,学习到的是与颜色有关的特征。这与上面人眼和感知特性也是相通的,在底层,学习到的是边缘,形状,颜色等敏感等信息。\u003C\u002Fp\u003E\u003Cp\u003E细心的读者应该可以注意到,上面的参数,具有一定的互补性和对称性。\u003C\u002Fp\u003E\u003Cp\u003E2.2 高层卷积参数可视化\u003C\u002Fp\u003E\u003Cp\u003E到了高层,由于输入的通道数不再为3,所以无法像第一层那样,将其投射到图像空间进行直观的可视化。\u003C\u002Fp\u003E\u003Cp\u003E这时候就有了两种思路。分别是dataset-centric和network-centric方法。他们的区别就是,第一个要可视化核函数,必须要使用真实的输入数据。第二个,则是通过生成一个随机图片,然后进行迭代的方法,来最大化响应层的神经元的激活,这个时候为使得输入的图片更加平滑,可以考虑使用GAN等方法。\u003C\u002Fp\u003E\u003Cp\u003E主要的研究方法包括两种,反卷积法【2】和梯度计算法【3】。\u003C\u002Fp\u003E\u003Cp\u003E反卷积方法的核心思想就是利用上采样从特征空间逐步恢复到图像空间。假设我们要可视化第1个feature map的一个unit,即特征图的一个像素的activation,则首先从数据集中计算一下多个输入图像各自经过前向传播后在这个unit上产生的activation,取出activation最大的一些图像,这些图像作为输入图。\u003C\u002Fp\u003E\u003Cp\u003E然后将输入图分别在这个unit上产生的activation进行反向传播,其他位置置为零。其中与pooling对应的就是uppooling,它通过在max pooling的时候记录下最大激活位置,在反卷积的时候进行恢复。与卷积对应的操作就是转置卷积操作,这是被用于图像分割的方法,也是通常意义上所说的反卷积。\u003C\u002Fp\u003E\u003Cp\u003E反卷积的结果,就是一个重建的图。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002Ff553c963271c4fa19722b875e8ce46ed\" img_width=\"1080\" img_height=\"665\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E梯度计算法包括标准的梯度计算法以及它的一些改进版本integrated gradients,guided backprop,基本原理如下,在训练的过程中固定网络的参数不变,学习输入。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Feb81c8aed67641c7ade0d6e74bd25bd2\" img_width=\"882\" img_height=\"152\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E反卷积法和梯度计算法可视化出来的结果,可以反映出神经元学习到的类别的轮廓,但是结果不够精细。GoogleBrain团队的deep dream【4】研究,对inception网络进行了逐层的特征可视化,揭示了每一个网络层的特性。该项目是通过输入随机噪声和想让网络学习的图像的先验知识,最后可视化网络学习到的该类的结果,虽然不是现实存在的图像,但是却具有该类别的特性,如同人类梦境中生成的不真实却又有辨识度的场景一样。\u003C\u002Fp\u003E\u003Cp\u003E下面展示了layer 4c层的一个神经元的结果。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fa423bcf56be54d6994c5cd4f57cc20e2\" img_width=\"780\" img_height=\"680\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Ch1\u003E\u003Cstrong\u003E3 激活热图可视化\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E可视化了卷积参数,它可以反映出所学习到的网络的参数本身有什么样的特点,它是从神经元的角度解释了 CNN,而激活热图可视化考虑从输入图像的角度解释CNN。它从输入图像中找出激活卷积层中特定神经元的选择性模式,来反应网络到底学习到了什么信息。\u003C\u002Fp\u003E\u003Cp\u003E特征图可视化的结果是sensitivity map,也叫saliency maps,以CAM(Class Activation Mapping)【5】方法及其变种为代表。\u003C\u002Fp\u003E\u003Cp\u003ECAM利用GAP(Global Average Pooling)替换掉了全连接层,将输出通道调整为输出类别数,再加权然后通过softmax层得到结果,可视化原理图如下:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F6feb33753b6d45fc8b98553f99982af8\" img_width=\"1080\" img_height=\"484\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E看上图,最后输入softmax的特征图,等于k个featuremap的加权和,其中w系数包括c维,c等于类别数目。等到了热力图之后,直接上采样到原图中就能得到激活区域,因为featuremap保留了原图的空间关系。\u003C\u002Fp\u003E\u003Ch1\u003E4 \u003Cstrong\u003E训练过程可视化\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E最后,我们通过tensorflow可视化开源框架来展示在项目中的可视化,由于我们前面已经有许多期文章讲述过可视化的各个模块细节,所以此处就不再做技术细节展示,而只展示结果。\u003C\u002Fp\u003E\u003Cp\u003E项目是这个:\u003C\u002Fp\u003E\u003Cp\u003Ehttps:\u002F\u002Fgithub.com\u002Fcarpedm20\u002FDCGAN-tensorflow,我们用来生成了一批嘴唇数据。\u003C\u002Fp\u003E\u003Cp\u003E4.1 loss可视化\u003C\u002Fp\u003E\u003Cp\u003Eloss等标量指标可视化可以反应网络的学习情况,是必须关注的。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F699702d75c5342e7b3a13e80fb80f08d\" img_width=\"740\" img_height=\"544\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F6813314870df43938047923c301142d4\" img_width=\"726\" img_height=\"540\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E4.2 中间结果可视化\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F53df66fa2c724880bdfefddbeb1406fa\" img_width=\"1080\" img_height=\"576\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E对于图像生成任务,没有什么比查看中间结果更加有说服力的了。\u003C\u002Fp\u003E\u003Cp\u003E4.3 网络结构可视化\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F875d4d5c2720417889cd1dbec31752c4\" img_width=\"1080\" img_height=\"394\" alt=\"「技术综述」“看透”神经网络\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003Etensorflow可视化网络结果虽然比caffe更加复杂,但也更加细致,关注关注没有坏处。\u003C\u002Fp\u003E\u003Cp\u003E另外,还可以查看权重的直方图分布等等,对于网络的性能判断也有辅助作用。\u003C\u002Fp\u003E\u003Ch1\u003E\u003Cstrong\u003E5 总结\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E\u003Cstrong\u003E正所谓一图胜千言,可视化起来high啊,这个坑远远没有这么简单。\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E如果你想了解更多,有一篇综述文章【6】做了分类,不过对于大部分人来说那个分类并不好理解,所以我还是按照本文的组织形式。\u003C\u002Fp\u003E\u003Ch1 class=\"ql-align-center\"\u003E参考文章\u003C\u002Fh1\u003E\u003Cp\u003E[1] Erhan D, Bengio Y, Courville A, et al. Visualizing higher-layer features of a deep network[J]. University of Montreal, 2009, 1341(3): 1.\u003C\u002Fp\u003E\u003Cp\u003E[2] Zeiler M D, Fergus R. Visualizing and Understanding Convolutional Networks[J]. 2013, 8689:818-833.\u003C\u002Fp\u003E\u003Cp\u003E[3] Simonyan K, Vedaldi A, Zisserman A. Deep inside convolutional networks: Visualising image classification models and saliency maps[J]. arXiv preprint arXiv:1312.6034, 2013.\u003C\u002Fp\u003E\u003Cp\u003E[4] https:\u002F\u002Fdistill.pub\u002F2017\u002Ffeature-visualization\u002F\u003C\u002Fp\u003E\u003Cp\u003E[5] Zhou B, Khosla A, Lapedriza A, et al. Learning deep features for discriminative localization[C]\u002F\u002FProceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 2921-2929.\u003C\u002Fp\u003E\u003Cp\u003E[6] How convolutional neural network see the world - A survey of convolutional neural network visualization methods\u003C\u002Fp\u003E\u003Cdiv class=\"tt-column-card\" data-content='{\"new_thumb_url\": \"http:\u002F\u002Fsf1-ttcdn-tos.pstatp.com\u002Fimg\u002Fpgc-image\u002F1562643028042e28f8cdd51\", \"title\": \"\\\\u7f51\\\\u7edc\\\\u6a21\\\\u578b-CNN\\\\u7f51\\\\u7edc\\\\u8d77\\\\u6e90\", \"distribution_user_id\": 1585011497933837, \"price\": 8.88, \"column_id\": \"6711502680423940356\", \"share_price\": 3.55, \"author_description\": \"\\\\u6709\\\\u4e09AI\", \"thumb_url\": \"http:\u002F\u002Fp8.pstatp.com\u002Flarge\u002Fpgc-image\u002F1562643028042e28f8cdd51\", \"sold\": 4}'\u003E\u003C\u002Fdiv\u003E\u003Cdiv class=\"tt-column-card\" data-content='{\"new_thumb_url\": \"http:\u002F\u002Fsf3-ttcdn-tos.pstatp.com\u002Fimg\u002Fpgc-image\u002F15626436752143a445002ff\", \"title\": \"\\\\u7f51\\\\u7edc\\\\u6a21\\\\u578b-\\\\u6b8b\\\\u5dee\\\\u7f51\\\\u7edc\\\\u53ca\\\\u5176\\\\u53d8\\\\u79cd\", \"distribution_user_id\": 1585011497933837, \"price\": 9.99, \"column_id\": \"6711505913796116740\", \"share_price\": 4, \"author_description\": \"\\\\u6709\\\\u4e09AI\", \"thumb_url\": \"http:\u002F\u002Fp10.pstatp.com\u002Flarge\u002Fpgc-image\u002F15626436752143a445002ff\", \"sold\": 3}'\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E"
文章来源: https://www.toutiao.com/group/6712456588692554251/