卷积网络 CNN 学习笔记之五:就像医生看化验单

学习笔记之一:我们是怎么认识0的

学习笔记之二:细节消失,抽象生成

学习笔记之三:卷积像卷地毯

学习笔记之四:最终形成判断

今天,我们看上一次的代码跑起来是什么样子的。

输入图像

这个是输入图像,维度是 28x28x1 。 这是 MNIST 图像集里面的第1002号数字。我用我的人脑处理了一下,觉得似乎是一个  1 。我们看看电脑如何处理。

卷积层

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))

经过训练,得到如下 32 个卷积核:

输入的图像经过32个过滤器(filter)之后,输出是如下的 32 个 26×26 的图像。如果你还记得的话,是拿左上角的 0 号过滤器,从输入图像的左上角开始,9 个点对应的 9 个点分别相乘,然后把这一个像素的数据输出到下面的图的最左上角的那个像素。如此 26 x 26 次以后形成左上角的图像。再如此用第二个过滤器来制作第二个图像,如此 32 次以后,下面的 32 个图像就完成了。

池化层

这些看不太清的图像继续经过一个池化,每4个像素合并成一个像素,直观感觉就是在一个不是很清楚的图像上面继续打了马赛克。

打马赛克的作用就是为了减小下一层的负担。实践证明,打了马赛克和不打马赛克,对于准确率几乎没有影响。

model.add(MaxPooling2D(pool_size=(22)))

大家可以试验一下,就算是把pool_size增加到(8,8),也就是八八六十四个点缩成一个点,下一层也基本上可以达到98%的准确率。这就好比给你 4K 高清大图,还是这种 28 x 28 的模模糊糊的图,你对数字的识别率都差不多。

压平层

model.add(Flatten())

经过这个简单的压平,如下就是最终准备给分类器看的数据了。这是一个 在5408 个维度的特征值的柱状图。这个像不像一个化学分析报告?

我觉得这个结果特别像我拿到的验血报告。这个报告指出了我在一些指标上异常,至于这些异常代表着什么,我一脸迷茫,但是对于经验丰富的医生来说,他们可能一眼就可以看出来,我得的是什么病。比如他看到如果白血球水平偏高,同时D-二聚体升高,在随便看几个相关的指标,立刻就知道这是血栓的特征。而这些知识,是医生看了几千个病例,计算机看了60000多个病例,以后慢慢学会的。

全连接层

model.add(Dense(10, activation='softmax'))

终于到了揭晓谜底的时候了。经过一个全连接层,如上的验血报告就得出了确定的答案。在 0 – 9 的 10 种可能里面,计算机毫不犹豫的给了 1 几乎100% 的投票,而其他的可能性它认为接近为 0 。

如下是打印出来的计算机认为的可能性。和它最接近的第二名 4 的可能性已经骤降到了 1.69 x 10 的-26次方,也就是

0.0000000000000000000000000169 

其他的选项比这更低。看起来计算机还挺自信的呢。

[0.0000000e+001.0000000e+00 0.0000000e+00 3.3420391e-30 1.6909421e-267.0893234e-33 0.0000000e+00 0.0000000e+00 5.1055432e-27 3.4242518e-33]

医生的比喻

或许用比喻是最好理解一样事物(虽然必然会有一些偏差)。我们就用一个医生来比喻人工智能的算法好了。

原来人工智能发展缓慢的原因,就好像抽了一管血,然后交给医生说:帮我看看,我得了什么病。医生只能通过血的颜色,黏稠度等表面的信息去判断,当然准确度非常低。

当有了卷积神经网络的想法以后,问题一下子就变得简单了。医生手里面出现了几十种不同的“filter”,可以对血液进行分析了。

比如一个 filter 叫做“红细胞数量”。医生拿出一个显微镜,再把一滴血滴在血细胞计数器(Haemocytometer)上,然后认真的数一下,就得到了一个指标:后细胞数量。在数红细胞的时候,他对白细胞以及其他各种细胞都直接忽略。

然后他开始数白细胞。在数白细胞数量的时候,他对红细胞彻底忽略,然后就有了检测报告的第二行。卷积网络每一个过滤器都有自己特定的关注点,比如检测竖线的过滤器,对纯色卷积结果为0,对横线卷机结果为0,哪怕是颜色反过来的竖线(比如检测黑到白的边缘的,对于白到黑的边缘),因为ReLU函数的原因,结果也是0。这样子使得每个过滤器就跟医学上分别数细胞和白细胞的操作一样,绝对不会混在一起。正因为分离了,对下一步才更有帮助。

当他把所有的实验都做完了,就形成了一个完整的检测报告。从一滴血看出来病人得了什么病不太可能,但是经过了拆解,得到的中间数据就容易多了。

计算机的学习过程

那么问题来了,医生是通过多年的理论才学会的,计算机开始什么都不懂,怎么最后好似有了智能一样呢?到现在为止,我们大约的知道了计算机是如何通过分了四层一层一层的把复杂问题变成简单无比的问题的。但学习过程依然是个黑盒。工程师无法忍受黑盒,所以接下来我们会去了解这个黑盒。

但现在有一点是肯定的,以前的程序都是一行一行的,现在大家看到了,未来的人工智能的程序都是一堆一堆的数。比如我们这个数字识别程序,就是54,410个数字。如果你拿笔把这些数都抄在在你的本子上,你就拥有了这个程序。

后台回复 AI 可以获得没有发表的 AI 相关的文章和代码。

发表回复

您的电子邮箱地址不会被公开。