CNN 可视化结果分析

本文试图对CNN到底做了什么,给出一些分析解释。通过观察卷积层的输出构成的灰度图,试图寻找这个卷积在物理上有什么作用。训练数据是一些验证码图片,用了四个卷积层和两个全连接层的模型,在训练集上训练到98%的准确率,验证集80%。具体代码可参考我前面的这篇博文《CNN识别图形验证码》。图片似乎只有翻墙才能看到,不好意思。

可视化结果分别从以下几个角度做分析:

1 看每个卷积层经过激活函数(relu)后的输出图像

第一个卷积层的结果(相对比较容易懂):

为了方便人眼观察,对每一幅图的像素值都做了一个放大,做法是除以这幅图的最大像素值然后乘以255。灰度图中越亮的部分,就说明原来的值越大。注意,这样的做法导致,不同的图中比较像素点的相对亮度是没有意义的。

原图:

可以观察,不同的filter可以提取到不同的特征:

比如这个filter可以把所有要识别的目标提取出来,过滤掉背景颜色和噪音。

这两个filter把所有非背景部分提出来,但一个关注上半部分,一个关注下半部分。

这个filter对这幅图片“不感冒”。

这两个filter,一个关注字符右半部分,一个关注左半部分。

 
   

这个filter只提取噪音。

这两个filter,一个分别只提取右斜的笔画,一个只提取左斜的笔画。

  

这个filter把轮廓线提取出来。

把每个字符交叉的部分提出来。

总结:不同的filter“看”的视角不同,有是否包含噪音,左右,上下,交叉点,左斜右斜,轮廓线等等,这些提取的基本特征,能帮助后面更好的抽象,并且很大程度影响最后的预测结果。

conv2(开始不那么好解释了)

分别关注字符的左边部分和右边部分。

提取出背景部分,提取出的背景并不完全一样。

注意最右边,很亮的一条,本来应该是背景的,却在提取内容的filter中给了很高的关注。

最下边,黑色的一条,本来应该是背景的,却在提取背景的filter中,没有被提取出来。

综上两条,边界本来应该是背景的部分,被认为是内容。不知道是不是过拟合的原因,或者是代码存在bug(但并不是每副图片都有类似现象)。(第一和第三个卷积层中也有类似现象, 但第四层就没有了)

类似的奇怪现象:

提取轮廓。

分别关注上半部分和下半部分。

提取出需要识别的字符部分

总结,第一层的filter不提取背景,而第二层开始提取,有趣的现象。

conv3

也会提取背景:

内容,之前能看清轮廓的字符,现在都缩小到了只有一个小光点:

出现只提取单个或几个,但不是全部字符的filter,但不清楚提取的到底是什么特征:

上一层中,边界上的奇怪现象,依然存在:

conv4

第四层基本上是第三层的延续,但提取的特征更加抽象:

2 比较不同的输入,每个filter的结果

能理解的filter,比如做边界提取,都可以看出对不同的输入也做的是同样的事情。到后面层,filter提取出的特征都成了光点之后,就不是很明白了。不同输入提取结果不一样。

3 对预测错误的图片进行分析

预测结果:U T U o v i

把L看成了U

从第一层提取出的特征可以看出,特征就提取错了,把L的一横当做噪音给隐去了,又把斜着的那条噪音当做了字符部分。(我觉得提取出来的更像V而不是U)

但这个提取噪音的filter,也确实把斜着的那条噪音提取出来了,不知道为什么同时分给了内容和噪音两个部分。

预测结果: T l F X C u

把r看成了T

预测结果:B l W n P i

实际结果:B k W n P L ,人也很难看出来。

机器是怎么看呢?

提取出来的内容,其实效果也很差。

但是,看这张背景图,效果就好很多了。

预测结果:e I D n w w

实际结果:e j D k w m

错了两个,特征提取效果确实很差,没有训练好

4 用随机初始化的模型得到的结果

基本什么都没学到,并没有focus到需要的地方。

值得注意的是,随机初始化也可以得到这种去掉噪音的图片(左),可以和训练好的模型类似的图片(右)对比。

不过总体而言,随机初始化的结果,和训练好的模型的结果,相差还是非常大的,说明训练过的模型确实学到了东西。

5 跑网站(江苏)上爬取下来的图片,检查用分布不同的数据训练的模型,是否也有好的效果

原图:

可以看出除了和训练数据噪音类型不同,还是有很多相同之处。

虽然效果不是特别好,但还是能看出提取了一些特征。

也有效果很差的。

总的来说,在新的没见过的类型的数据集上,filter提取特征的效果,比在和训练集分布相同的数据集上,效果要差很多。不过比随机初始化还是好很多的。因此考虑说,对于一个分布不完全一致的数据集,并不一定要从头开始训练,而是可以利用在类似数据集上训练好的模型参数,做初始化。这样的预训练,也许可以减少所需要的打好标签的新数据的数目。

想了解更详细的内容,可以找我要数据。ps,karpathy做的这个CNN可视化演示很漂亮http://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html,值得参考。

时间: 2024-10-11 06:21:06

CNN 可视化结果分析的相关文章

对CNN模块的分析

对 CNN 模块的分析,该论文(Systematic evaluation of CNN advances on the ImageNet)已经做过了,里面的发现是非常有帮助的: 使用没有 batchnorm 的 ELU 非线性或者有 batchnorm 的 ReLU. 使用一个学习到的 RGB 的彩色空间转换. 使用线性学习率衰退策略. 使用平均和最大池化层的和. 使用大约 128 到 256 的 mini-batch 大小.如果这对你的 GPU 而言太大,将学习率按比例降到这个大小就行. 使

CNN 可视化示例

CNN 可视化示例For keras < v1 In [1]: import os os.environ['THEANO_FLAGS']='mode=FAST_RUN,device=gpu,floatX=float32' # This gives a 'perform' error in compile #os.environ['THEANO_FLAGS']='mode=FAST_COMPILE,device=gpu1,floatX=float32' #os.environ['THEANO_FL

能源管控系统开发,BI大数据可视化管理分析平台开发

能源管理系统是以帮助工业生产企业在扩大生产的同时,合理计划和利用能源,降低单位产品能源消耗,提高经济效益为目的信息化管理系统.通过能源计划,能源监控,能源统计,能源消费分析,重点能耗设备管理,能源计量设备管理等多种手段,是企业管理者对企业的能源成本比重发展趋势有准确的掌握,并将企业的能源消费计划任务分解到各个单位,是节能工作责任明确,促进企业健康稳定发展.针对我国工业生产线中的在线计量.功效检测技术和节能控制技术严重缺乏等问题.研究开发工业生产线关键点在线电能计量.加工功效有效性分析技术,工业生

CNN可视化可行性

一次卷积过程类似于下图,下面动图是GIF图(上下图数据一致,但是只看方法),不过是三维的(可以看做比二维的多一个颜色维,RGB).如果将上下图结合来看,下图只看两维的话,下面第一行就是把目标图(需要识别的图)利用过滤器求积,步长是2(每次向右向下移动两格).那么对上图的理解就是,有一个过滤器(曲线)对整个图进行每个局部的求积,从而找到与其对应的最相似的局部(积最大),每个layer层都有若干过滤器,过滤器的值需要机器学习进行一次一次迭代修改,从而让机器自己找到最理想的卷积核(过滤器)例如上图的曲

Light Weight CNN模型的分析与总结

本文选择了4个light weight CNN模型,并对它们的设计思路和性能进行了分析与总结,目的在于为在完成图像识别任务时模型的选择与设计方面提供相关的参考资料. 1 简介 自AlexNet[1]在LSVRC-2010 ImageNet[22]图像分类任务上取得突破性进展之后,构建更深更大的convolutional neural networks(CNN)几乎成了一种主要的趋势[2-9].通常,获得state-of-the-art准确率的模型都有成百上千的网路层以及成千上万的中间特征通道,这

专栏文章推荐:轻松玩转ELK海量可视化日志分析系统

最近一直在更新ELK系列的专栏,此专栏主要是针对ELK从入门到实战应用的介绍,内容非常实用,通过多年对ELK的使用经验,此文浓缩了ELK的各种应用技能和总结,强烈推荐给大家阅读. 在学习过程中,如果遇到任何问题可在本文后面留言,或者在专栏里面留言. 下面是专栏的介绍. 专栏介绍 ELK是目前行业中非常热门的一个技术,它可以用于电商网站.门户网站.企业IT系统等各种场景下,也可以用于对海量的数据进行近实时的数据分析. 专栏深入浅出剖析ELK在企业常见应用框架以及ZooKeeper.Kafka与EL

【shadertoy】向量场可视化实例分析(1)

在写之前,首先给大家介绍一个学习shader的网站shadertoy.最近因为做项目要显示向量场,学习了一些GLSL着色语言的知识.虽然GLSL本身不难学,但对一个初学者来说,没有强大的数学和图形学功底,基本很难想写出好的shader.shadertoy提供了很多shader的例子,大家可以直接借鉴这些例子,编辑自己的shader. 向量场可视化 绘制向量场的方法有很多种,常见的有LIC(线积分卷积)纹理流场和箭头向量场(详细的介绍见:http://www.zhanpingliu.org/Res

[DL] CNN源码分析

在Hinton的教程中, 使用Python的theano库搭建的CNN是其中重要一环, 而其中的所谓的SGD - stochastic gradient descend算法又是如何实现的呢? 看下面源码(篇幅考虑只取测试模型函数, 训练函数只是多了一个updates参数): 3 classifier = LogisticRegression(input=x, n_in=24 * 48, n_out=32) 7 cost = classifier.negative_log_likelihood(y

在Scholarspace可视化交互式分析中遇到的几个问题及处理方法

1 JavaScript中的变量作用范围 JS中的变量作用域是以函数为单位的,因为在两个for循环中,不能用同一个变量命名作为循环的控制条件,不然会陷入死循环退出不来.曾经为了处理这个问题花看一天的时间,但是一直怀疑是不是浏览器是不是能加载那么大的数据,一直在数据的大小上找问题,后来才发现更改的. 2 对JSON数据的请求加载,有一个JSONP问题,也就是为了数据访问的安全性,不容许数据的跨域加载. 3 JSON数据的加载中,若有问题,可以定义到具体问题,有针对性的处理,向郝学习~~