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

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

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

总算可以正式开始讲卷积网络的工作原理了。

过滤器像卷地毯一样卷过去

上面的白纸就像图像,而我们现在拿一个红颜色的格子,这个格子是 3 x 3 ,里面写着9个数字。这 9 个数字开始是随机数,经过大量的训练以后开始不断的变得有意义。

这个红色的小纸片,会先从图像的左上角开始,和最左上角的 3 x 3 的那一小片重合,就得到了九对数字,就是每一个位置的红纸片上 和 它压住的那个位置的白纸片上的数字 形成了一对。

我们把这九对数字两两相乘,然后把乘积相加,最后形成 1 个数。把这个数填写在另外一个空白的格子的最左上角。

然后这个小红方块向右移动一格,再做同样的操作,然后接着向右移一格。到头了再回到最左边,再向下移动一行,再如此移动。就这样用一个小红纸片把这个白纸上的所有的位置都扫描一遍,从而把这张大白纸的数字变成另外一张大白纸的数字。

这个操作,就跟卷地毯一样,数学上成为卷积。

这有什么用呢?

这是个好问题。大家留意一下这个红格子里面的数字,我用了左侧都是 1 , 中间一列是 0 ,右侧都是 -1 的矩阵。大家想象这个矩阵放在什么样的数字上面产生的值会最大呢?

如果它放在纯色上面卷积出来的数字一定是0,比如放在纯黑色的部分。因为左边的数字和右边的数字相等而且一个为正一个为负。所以这个小方块滑过纯色的地方就是0。

如果它放在一个和它很类似的模式上,得到的数字会变的异常的大。比如说它放到了一个也是和它一样左边都是 1 ,右面都是 -1 的地方,这个卷积的结果将会是 6  ( 1 x 1 + 1 x 1 + 1 x 1 + -1 x -1 + -1 x -1 + -1 x -1)。

其实,这个图像就是一个竖线的检测器。它本身代表着一个竖线(左侧白色,右侧黑色),它在滑过图像的格子的时候,只有发现和它类似的模式的时候,就会点亮(返回很大的数字),而遇到其他的模式的时候就会暗淡(接近零或者负数),这样以来,经过滑动,我们就可以检测边沿了。这个叫做边沿检测(Edge Detection)。

多个Filter,来检测同一个图像

我们例子里面的这个红方块仅仅检测竖线,甚至它仅仅检测左边是白色,右边是黑色的竖线,而反过来的左黑右白的竖线它都不感兴趣。那如何把其他的模式也检测出来呢?

没关系,我们可以使用大量的检测模块。比如可以有另外一个。在我昨天的例子里面,我用了 32 个这样的小红方块,分别独立负责检测 32 种不同的模式。比如下面我又找了一个检测左上白色,右下黑色的从右上到左下45度的斜线的检测模块。

经过 32 个不同的检测模块,我们叫做 filter ,我们会把一副图片拆解成成 32 张新的图片。

但这里注意,如果原图的每一个像素里面的数据是代表了在灰度这个维度的 黑白程度 的话,那么生成的32张新的图像里面的每个像素代表的是在对应的 filter 下的和 filter 的程度。

这种 32 层的图像我们其实应该很熟悉。所有的彩色图像都是三层表示的,分别是RGB,代表着这个像素在三个不同维度的值,如果把这三层分别叫做 Red-ness, Green-ness, Blue-ness,这 32 个可能应该分别叫做 垂线度 (vertical-ness),横线度( horizontal-ness), 斜线度(diagnal-ness),叉度( cross-ness) 等等等等。不用去查了,这些词,无论中文还是英文都是我瞎编的。

第一层抽象完成

下面就是真实的实验结果了。如下就是 MNIST 数据集里面随机的一个数字,我目测是个 2 。

如下的上面四行就是训练以后生成的 32 个 filter 的样子,其中黑色代表接近 0 ,白色代表接近 1 。

这些 filter 已经很复杂,不仅仅是检测纯粹的横线或者竖线,但我们知道经过训练以后的这些 filter 一定是最有利于下一步计算机做决策的。

下面的后四行是上面的这个 2 分别经过 32 个 filter 以后形成的图像。你看到这些图像有点像被肢解了的 2 ,因为他们都分别关心 2 这个数字的不同的方面。 

下一篇文章我们将继续了解接下来的步骤,一步步深入下去。

后台回复 “ AI ” 可以获得全系列文章和代码

发表回复

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