利用Python实现卷积神经网络的可视化

开发技术 2018/5/24

对于深度学习这种端到端模型来说,如何说明和理解其中的训练过程是大多数研究者关注热点之一,这个问题对于那种高风险行业显得尤为重视,比如医疗、军事等。在深度学习中,这个问题被称作“黑匣子(Black Box)”。如果不能解释模型的工作过程,我们怎么能够就轻易相信模型的输出结果呢?

以深度学习模型检测癌症肿瘤为例,该模型告诉你它能够检测出癌症的准确率高达99%,但它并没有告诉你它是如何工作并给出判断结果的。那么该模型是在核磁共振扫描片子中发现了重要线索吗?或者仅仅是将扫描结果上的污点错误地认为是肿瘤呢?模型的输出结果关系到病人的生死问题及治疗方案,医生是不能承担起这种错误的。

在本文中,将探讨如何可视化卷积神经网络(CNN),该网络在计算机视觉中使用最为广泛。首先了解CNN模型可视化的重要性,其次介绍可视化的几种方法,同时以一个用例帮助读者更好地理解模型可视化这一概念。

1.卷积神经网络模型可视化的重要性

正如上文中介绍的癌症肿瘤诊断案例所看到的,研究人员需要对所设计模型的工作原理及其功能掌握清楚,这点至关重要。一般而言,一名深度学习研究者应该记住以下几点:

1. 理解模型是如何工作的

2. 调整模型的参数

3. 找出模型失败的原因

4. 向消费者/终端用户或业务主管解释模型做出的决定

现在让我们看一个例子,可视化一个神经网络模型有助于理解其工作原理和提升模型性能。

曾几何时,美国陆军希望使用神经网络自动检测伪装的敌方坦克。研究人员使用50张迷彩坦克照片及50张树林照片来训练一个神经网络。使用有监督学习方法来训练模型,当研究人员训练好网络的参数后,网络模型能够对训练集做出正确的判断——50张迷彩坦克全都输出“Yes”,50张树林照片全都输出“No”。但是这并不能保证模型对于新的样本也能正确分类。聪明的是,研究人员最初拍摄了200张照片,其中包含了100张迷彩坦克照片、100张树木照片。从中分别选取50张照片合计100张照片作为训练集,剩余的100张照片作为测试集。结果发现,模型对测试集也能正确分类。因此,研究人员觉得模型没有问题了,就将最终成果交付给军方。原以为军方会很满意这份研究成果,结果军方做出的反馈是他们进行测试后发现效果并不好。

研究人员感觉此事有点蹊跷,为什么之前测试时百分百准确,而军方测试的时候又掉链子了呢?最后终于发现,原来是研究者的数据集出现了问题,采集迷彩坦克的时候是阴天,而采集树林的时候是晴天,神经网络最终学会的是区分晴天和阴天,而不是区分迷彩坦克和树林。这真是令人哭笑不得啊,那造成这个问题的主要原因还是没有弄清楚模型的具体的工作原理及其功能。

2.可视化CNN模型的方法

根据其内部的工作原理,大体上可以将CNN可视化方法分为以下三类:

1.初步方法:一种显示训练模型整体结构的简单方法

2.基于激活的方法:对单个或一组神经元的激活状态进行破译以了解其工作过程

3.基于梯度的方法:在训练过程中操作前向传播和后向传播形成的梯度

下面将具体介绍以上三种方法,所举例子是使用Keras深度学习库实现,另外本文使用的数据集是由“识别数字”竞赛提供。因此,读者想复现文中案例时,请确保安装好Kears以及执行了这些步骤。

1初步方法

1.1 绘制模型结构图

研究者能做的最简单的事情就是绘制出模型结构图,此外还可以标注神经网络中每层的形状及参数。在keras中,可以使用如下命令完成模型结构图的绘制:

model.summary()  

_________________________________________________________________  

Layer (type)                 Output Shape              Param #     

=================================================================  

conv2d_1 (Conv2D)            (None, 26, 26, 32)        320        

_________________________________________________________________  

conv2d_2 (Conv2D)            (None, 24, 24, 64)        18496       

_________________________________________________________________ 

max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64)        0     

_________________________________________________________________  

dropout_1 (Dropout)          (None, 12, 12, 64)        0        

_________________________________________________________________  

flatten_1 (Flatten)          (None, 9216)              0        

_________________________________________________________________  

dense_1 (Dense)              (None, 128)               1179776     

_________________________________________________________________  

dropout_2 (Dropout)          (None, 128)               0          

_________________________________________________________________  

preds (Dense)                (None, 10)                1290        

=================================================================  

Total params: 1,199,882  

Trainable params: 1,199,882  

Non-trainable params: 0 

还可以用一个更富有创造力和表现力的方式呈现模型结构框图,可以使用keras.utils.vis_utils函数完成模型体系结构图的绘制。

1.2 可视化滤波器

另一种方法是绘制训练模型的过滤器,这样就可以了解这些过滤器的表现形式。例如,第一层的第一个过滤器看起来像:

top_layer = model.layers[0]  

plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray') 

一般来说,神经网络的底层主要是作为边缘检测器,当层数变深时,过滤器能够捕捉更加抽象的概念,比如人脸等。


中国· 上海

谷谷二维码
添加微信咨询

CopyRight©2009-2019 上海谷谷网络科技有限公司 All Rights Reserved. 沪ICP备11022482号-8  

关于我们 | 联系我们