神经网络的可视化
写在前面:
好久没有学习深度学习相关知识了,这几天觉得虽然现在工作跟深度学习无关,可是还是要继续下去,所以还是把最近学习的一些内容总结一下,不一定严谨,只是希望自己可以借此好好整理整理思路。
我们在训练神经网络的时候,需要调节大量的参数,神经网络的可视化对于调整参数有着很好的指导作用。
什么是可视化呢,先举一个简单的例子。
我们可以直接看第一层的feature map来观察神经网络是否取得了较好的效果:
(以下图片来自cs231)
左边的图片中的feature有很多噪声,这表示网络可能还没有收敛,或者学习速度不太对,或者是正则化没有做好;而右边的feature较为平滑,干净,并且特征也呈现出了多样化,这表示了训练较好。
1.实际上,最直观的可视化手段,就是去看前向传播中神经网络各层的**(即经过**函数后的状态)。对于ReLU**函数而言,在刚开始训练的时候,**看上去都是呈滴状的,且较为密集,之后会逐渐变得稀疏,呈局部化。如果一些**值一直是0,那么很有可能说明学习速率太高了。
(图片来源:cs231)
上面这幅图是第一层网络,下面这幅图则是第二层网络。
2.滤波器的可视化
第二种常见的方法是对权重进行可视化。通常是第一层权重的可读性较好。
训练得较好的网络的权重较为平滑,噪声较少。
(图片来源:CS231)
上图为AlexNet第一层权重的可视化
下图为AlexNet第二层权重的可视化
可以看出,第一层的权重非常平滑,而且从第一层的各个权重中我们也可以看出,各个滤波器在做什么。
3.提取能够最大**神经元的图片
还有一种手段,是保持整个网络不变,给网络输入大量的图片,针对某些神经元,观察哪些图片可以使他们**最大(输出的值最大)
下图为针对AlexNet第五层Pool层的神经元做的可视化,即用下面的图片,可以使他们**值最高。白色框代表的是感受野(感受野中的像素都会对第五层的一个神经元产生作用,算出来是163*163个像素)
下面分别介绍几篇相关的论文
《Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps》
1.这篇文章首先介绍一种通过输入图片进行可视化的技术,也就是神经网络是事先训练好的,固定的,对于指定的一个分类,想办法找出一个一张图片,使得网络在这个分类上得到的分数最高。
对于类别c, 输入图片I,
需要注意的是,我们在这里用到的是得分,而不是Softmax层得到的后验概率
我们可以通过back-propagation计算出来一个局部最优的I。
论文中提供了一个例子。可以仔细观察下图片,会发现一张图片中会出现多个物体,从而使得该类别的分数尽可能高。
2.显著性的可视化(原文是saliency visualization,我之前没有接触过机器视觉太多的知识,这里仅凭我自己查了一点资料感觉是应该这样翻译,表示图片中各部分对用户的重要程度,不知道理解是否有误)
给定一个图片
假设网络是线性的,我们可以很容易得到
这时候,
对于卷积神经网络而言,我们可以通过一阶泰勒展开得到一个近似方程
其中,
其实可以把这个公式解读为,优化器试图来寻找得分
根据上述公式,我们不难得到saliency map
这种计算显著图的方法,不需要额外的工具,如bounding box或者segmentation mask,计算起来非常快。
由于像素的位置其实给出了图片中的一些位置信息,因此,我们也可以做物体的定位。