您现在的位置是:首页 >技术交流 >一篇文章, 搞清楚卷积与卷积核到底是怎么回事网站首页技术交流
一篇文章, 搞清楚卷积与卷积核到底是怎么回事
卷积, 卷积核相信大家不太陌生, 但是我本人一直感觉懵懵懂懂, 好像总隔着点儿啥, 最近今天终于明白了…尝试讲一下, 如果看完这篇文章, 你还是搞不懂卷积, 就去美团送快递吧, 没必要在这儿死磕了…
首先, 拿MNIST的样本, 一个2828的手写灰度图为例:
拿出其中的88的区域举例, 这样放大画图容易, 例如:
这是其中的88像素, 具体是哪部分无所谓了.
如你们所知, 所有的图片内的像素, 就是数字, 这个88的部分, 就是由8*8个灰度数字组成的:
灰度从0到255, 数字越大, 颜色越浅或者越亮, 越白, 怎么理解都行, 灰度图是这样的, RGB三通道也是一样的道理.
可以看到中间部分有些区域是有白色的, 逐渐过渡到边缘黑色/无色.
然后我们使用一个33的小矩阵, 作为一个卷积:
如果玩过OpenCV的一些人脸检测的算法, 这里是一样的玩法, 拿这个小卷积, 在88的图像区域的像素, 进行从左到右, 从上到下的窗口滑动, 滑动的时候, 把对应的灰度值相乘, 然后把乘积相加, 作为一次卷积的结果.
例如左上角的 02 =0
中间的00 =0
把卷积核的9个值都依次与88小图片中左上角的33区域的每一个值做完乘法之后, 再相加得到一个值, 作为这个区域的卷积结果.
然后, 把目标窗口向右移动1步(先说一嘴这里有个步长的概念, 就是滑动多少个像素):
重复刚才的过程, 依次相乘再相加, 得到一个值.
继续向右, 向下挪动.
依次计算后, 得到一个新的, 6*6的新数组/张量/像素集合/图片
稍微处理化一下, 把超过255的值, 都顶头显示为255, 就成了:
原始图像卷积之后图像的变化:
而这个3*3的小图片, 就是卷积核:
聪明如你, 肯定要问, 这个卷积核为啥长这样?
卷积核是如何帮助我们去提取图片的纹理, 形状, 斑点这类特征的呢? 下面来一个有代表性的卷积核:
它可以提取出垂直边缘, 即你如果把这个卷积核理解成一个深度网络的神经元, 则这个神经元对图像中的垂直排列的边缘像素非常敏感, 如下图, 经过这个卷积核, 这个杯子的垂直边缘保留了, 其他的部分被弱化了.
具体来说, 把一个杯子的边缘的一部分比如取8*8个像素放大, 作为一种极端情况来观察:
可以看到类似右侧这种情况, 左边是浅色像素, 右边是深色像素.
像素的灰度恰好左边都是60 右边是0, 这里跟OpenCV里面一致, 颜色值约高则越亮.
卷积核长这样:
卷的时候, 会依次从左到右, 从上到下卷过图像的这个区域.
卷的过程就是做一个卷积运算的过程.
全部像素为60的小窗口, 卷积计算的结果为0:
左侧全部为60的像素, 卷积结果都是0, 同样右侧像素值为0的部分, 卷积结果也还是0, 唯一特殊的部分是一部分为60, 一部分为0的中间的像素
只有中间部分, 比如下面这个框
卷积结果是180:
这一列与右边紧挨着这一列的结果都是180:
相当于, 两边黑色区域, 夹了一条白/浅色的区域.
同样的道理, 我们可以使用类似的方式, 得到一个水平边缘特征提取的卷积核.
使用不同的卷积核, 提取不同的特征:
左图中的竖线部分, 都被垂直特征卷积核保留了而把水平线弄没了, 横线的部分, 被水平特征提取的卷积核保留了而垂直的线都被弱化了.
看看具体的MNIST上的应用, 首先把手写体的数字1, 向右移动一点, 还是1, 对吧.
在右侧的1上方, 加一横
理论上, 应该被识别为7, 对吧.
那问题来了, 左侧的1, 应该被识别为1, 还是7?
如果是人来判断, 妥妥应该是还是1, 对吧.
但是如果使用普通的全连接神经网络, 把图片像素挨个拿出来, 组成一维数组, 放入网络进行识别:
在这个竖线出现的部分, 向右移动的1, 跟7的像素, 看起来是很像的(相位层面)
反而, 这个向右移动的1, 跟原来的在中间的1, 相位上差异还挺大:
这就导致, 最终, 单纯全连接的神经网络会认为这个向右移动的1, 更像7, 从而导致识别错误率较高, 因为它只能从一个维度上去看问题, 而无法了解二维方向上的生物特征.
就像你无法从
这种图片, 认出这是个啥, 因为这是一个图片的像素被依次提取出来, 形成的一维数组, 还原之后:
在卷积神经网络眼里, 则是在用二维空间来"看"图片并提取特征的.
例如, 当我用一个横向特征提取的卷积核
来提取这3张图片的特征时:
就会发现, 中间的1更像上面的1, 而不是7, 即7具备的横向特征, 中间的1没有, 就像两只狗狗跟一个人站在一起, 你用多毛这个特征来做分别, 你就会发现, 两个狗狗长得更像, 跟人差得远一点.
至于多毛的卷积核长啥样呢? 以后再说.
所以, 关键就在于, 卷积计算, 能够利用各种类型的卷积核, 对输入图像, 在不同的维度(层层池化)对特征进行提取, 比如有些层的卷积核负责提取边缘, 有些负责提取形状, 有些负责提取纹路, 有些提取特殊的颜色, 斑点等等, 最终形成了一个网络, 会对记住某类物体的综合的特征, 比如一个苹果, 首先它是圆的, 有圆圆的特征, 然后要么是红的, 要么是黄的, 取决于样本, 然后上面可能有些高光跟纹路, 等等, 组合起来形成了一个苹果的综合的印象被存储在模型的参数当中了, 这个神经网络学习的过程, 是不是跟人类孩子们认知事物的过程其实很像?
这就是卷积核的作用.