看图像的眼睛,CNN
前面我们看到神经网络把神经元层层叠起,学到复杂的模式。可一张照片有几万个点。把它直接铺成一行塞进普通网络太多了,而且同一只猫只要挪一点位置,就成了完全不同的输入。于是出现了一种像人眼那样扫看小块、寻找特征的方法。这就是看图像的网络,CNN。
照片其实是数字格子
在我们眼里只是一幅画。
可要把照片交给计算机,
最终得把它变成数字。
把照片凑得很近看,
会看到小点,像素,密密地排成格子。
每个点用一个数字记着它的亮度。
亮的点是大数,暗的点是小数。
所以一张照片,
其实就是每格装着亮度数字的格子。
点图放大看看。凑近看,每个小点里都装着亮度数字,就能看出照片其实是数字格子。
一放大,数字就出来了。
亮格是大数,暗格是小数。
人一眼就看出形状,
可对计算机来说,只是一张满是数字的表。
那么在这么多数字里,
它怎么找出边缘、曲线那样的特征呢?
一下子全看太多了,
所以从小块开始一点点察看。
用小滤镜找特征
找特征的工具就是滤镜。
滤镜是一块小板,比格子小得多。
就像把放大镜按在一个地方。
比如找竖直边缘的滤镜,
喜欢左暗右亮的花样。
把滤镜按在图像的一个窗口上,
看它和那里的数字有多合得来。
花样正好对上,分数就高,
对不上,分数就低。
把滤镜按到格子的不同窗口上看分数。和滤镜花样(左暗右亮)相像的地方分数高,意思是那里有竖直边缘。
每按一处,分数都不一样。
花样合上的地方分数高。
意思就是那里有竖直边缘。
最要紧的是一点。
同一个滤镜不管按到哪里,
找的都是同一个特征。
所以边缘在画面左边也好,
右边也好,都能抓到。
那就别只看一处,把全部都扫一遍。
滑动滤镜做出特征图
现在把滤镜一格一格地挪。
从左上角开始,
往右一格,再往右一格。
到头了就下移一行,
再从左边扫起。
把每处的分数记下来,
这些分数聚起来,成了一张新的小格子。
这就是特征图。
哪里那个特征强,一眼就看出来。
点滤镜,一格一格地滑。每处的分数填进右边的特征图。滤镜走完,地图就显出那个特征在哪里强。
滤镜把整张格子都扫过去了。
分数聚起来,成了特征图。
它比原照片小,
却清清楚楚显出那个特征在哪里。
一个滤镜只找一种特征。
所以实际上要一起用好多滤镜。
竖直边缘、水平边缘、曲线,
不同的特征一下子全找。
不过这还只是小特征罢了。
层越高,特征越大
再用滤镜把特征图扫一遍,
小特征聚起来,成了更大的特征。
前面的层看点和边缘那样的小碎片,
上面的层把边缘汇成眼睛或鼻子,
更上面的层把五官汇成整张脸。
跟神经网络里叠层一模一样。
只是这里每层都用滤镜扫,这点不同。
所以层越往上,
抓到的特征越抽象。
点按钮,一层一层往上爬。从边缘开始,到眼睛、鼻子那样的部分,再到整张脸,抽象度一步步升高。
每往上一层,看到的就更大。
从边缘到眼鼻,再到脸。
低层看小而简单的碎片,
高层把它们汇成有意义的形状。
很像人认东西。
看线,认出部分,知道整体。
这样用小滤镜扫看找特征,
把这些层叠起来抬高抽象度,
正是看图像的 CNN 的本事。
来理一理
归成一句话,是这样。
照片其实是装满亮度数字的格子。
CNN 把一个小滤镜,放大镜,按在一个窗口上,
给那里有没有那个特征打分。
把同一个滤镜在格子上滑,
就成了一张不管特征在哪都能找到的特征图。
把这样的层叠上好几层,
从边缘到眼鼻,再到脸,
抓到越来越抽象的特征。这就是 CNN。
依次点要点回顾一下。(照片是数字格子 -> 小滤镜给特征打分 -> 滑动做出特征图 -> 层越高特征越抽象)
现在你知道了计算机怎么看一幅画。
把照片变成数字格子,
用小滤镜扫看找特征,
再叠起层一步步抬高抽象度。
挪了位置的猫,同一个滤镜照样一下找到。
用放大镜扫看、汇起特征这个简单的点子,
就是认得出图像的聪明机器的根基。
下回咱们接着看,这样看到的东西,
怎么也用到文字和声音上。