您现在的位置是:首页 >技术交流 >一篇文章, 搞清楚卷积与卷积核到底是怎么回事网站首页技术交流

一篇文章, 搞清楚卷积与卷积核到底是怎么回事

Montauk LUO 2023-06-18 08:00:03
简介一篇文章, 搞清楚卷积与卷积核到底是怎么回事

卷积, 卷积核相信大家不太陌生, 但是我本人一直感觉懵懵懂懂, 好像总隔着点儿啥, 最近今天终于明白了…尝试讲一下, 如果看完这篇文章, 你还是搞不懂卷积, 就去美团送快递吧, 没必要在这儿死磕了…

首先, 拿MNIST的样本, 一个2828的手写灰度图为例:
在这里插入图片描述
拿出其中的8
8的区域举例, 这样放大画图容易, 例如:
在这里插入图片描述
这是其中的88像素, 具体是哪部分无所谓了.
如你们所知, 所有的图片内的像素, 就是数字, 这个8
8的部分, 就是由8*8个灰度数字组成的:

在这里插入图片描述
灰度从0到255, 数字越大, 颜色越浅或者越亮, 越白, 怎么理解都行, 灰度图是这样的, RGB三通道也是一样的道理.
可以看到中间部分有些区域是有白色的, 逐渐过渡到边缘黑色/无色.

然后我们使用一个33的小矩阵, 作为一个卷积:
在这里插入图片描述
如果玩过OpenCV的一些人脸检测的算法, 这里是一样的玩法, 拿这个小卷积, 在8
8的图像区域的像素, 进行从左到右, 从上到下的窗口滑动, 滑动的时候, 把对应的灰度值相乘, 然后把乘积相加, 作为一次卷积的结果.
例如左上角的 02 =0
在这里插入图片描述
中间的0
0 =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没有, 就像两只狗狗跟一个人站在一起, 你用多毛这个特征来做分别, 你就会发现, 两个狗狗长得更像, 跟人差得远一点.
至于多毛的卷积核长啥样呢? 以后再说.

所以, 关键就在于, 卷积计算, 能够利用各种类型的卷积核, 对输入图像, 在不同的维度(层层池化)对特征进行提取, 比如有些层的卷积核负责提取边缘, 有些负责提取形状, 有些负责提取纹路, 有些提取特殊的颜色, 斑点等等, 最终形成了一个网络, 会对记住某类物体的综合的特征, 比如一个苹果, 首先它是圆的, 有圆圆的特征, 然后要么是红的, 要么是黄的, 取决于样本, 然后上面可能有些高光跟纹路, 等等, 组合起来形成了一个苹果的综合的印象被存储在模型的参数当中了, 这个神经网络学习的过程, 是不是跟人类孩子们认知事物的过程其实很像?

这就是卷积核的作用.

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。