卷积神经网络(CNN)-卷积层(灰度图)

概述

卷积层(Convolution) 的作用:在图片上进行 特征提取,每次在 一个小区域 进行特征提取

本文以 对 灰度图 进行 边缘检测 作为案例

人怎样识别图片

人在识别图片时,首先得找到图片中各个部分的 边缘 和 轮廓,而 边缘 和 轮廓 只与 相邻近的像素 有关。

也就是说:人识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首 先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息

这个过程就像我们看美女、帅哥,先看局部,再看整体

案例(吴恩达)

如下面的左图,经过 垂直边缘检测 和 水平边缘检测 ,得到右侧的两幅图,如下图:

本案例重点讲解 垂直边缘检测

1. 图像数据

上图是灰度图,只是黑白,假设 此图的数据是6*6*1的矩阵,如下:

2. 垂直过滤器(卷积核)

为了检测图像中的 垂直边缘 ,构造一个3*3的矩阵,如下图:

在卷积神经网络中,这个矩阵被称为 过滤器(Filter) 或者 滤波器 或者 卷积核(Kernel)。

3. 图像 与 卷积核 运算(卷积运算)

使用3*3矩阵的 卷积核 和6*6矩阵的灰度 图像 ,进行 卷积运算

过程如下:
在图像矩阵上,有一个和 卷积核 相同尺寸的 滑窗(下图粉色部分),然后将滑窗中的矩阵 与 卷积核矩阵对应位置 相乘,然后再求和,具体如下

动态图显示

https://gitee.com/65242847/images/blob/master/%E5%8D%B7%E7%A7%AF%E5%8A%A8%E7%94%BB%E5%9B%BE.md

第1次运算:

第一步:

将图像上 滑窗 3*3矩阵,与 3*3的 卷积核 做乘法运算:

运算过程如下:

第二步:

然后将该矩阵 每个元素相加,即3 + 1 + 2 + 0 + 0 + 0 + (-1) + (-8) + (-2)= -5,结果-5就是4*4矩阵第一行第一个元素

注意: 此步需要加上 一个 偏置量(bias),偏置量 默认为0,所以没体现,下同

第2次运算:

第一步:

将图像上 滑窗 3*3矩阵 右移一格,与 3*3的 卷积核 做乘法运算:

运算过程如下:

第二步:

然后将该矩阵 每个元素相加,即0 + 0 + (-2) + 5 + 0 + (-9) + 7 + 0 + (-5)= -4,结果-4就是4*4矩阵第一行第二个元素

第3次、第4次运算

将图像上 滑窗 3*3矩阵 右移一格,与 3*3的 卷积核 做乘法运算,结果如下:

将图像上 滑窗 3*3矩阵 右移一格,与 3*3的 卷积核 做乘法运算,结果如下:

第5次运算

将图像上 滑窗 3*3矩阵 下移一格 并 移动到最左侧,与 3*3的 卷积核 做乘法运算,结果如下:

第n次运算

同上

结果

最终结果如下:

水平边缘检测

水平卷积核如下:

水平边缘检测原理 与 垂直边缘检测原理 相同

卷积核

卷积核权重:

  1. 即卷积核 矩阵中的数值
  2. 在tensorflow/keras中是随机初始化的
  3. 在训练时,通过学习会自行修改

卷积核的种类:

有很多种类,用于提取不同的特征,所以一般会有 很多个 卷积核

https://my.oschina.net/u/876354/blog/3064227

如何设置卷积核?

小而深,单独较小的卷积核也是不好的,只有堆叠很多小的卷积核,模型的性能才会提升

卷积核大小通常为 奇数

移动步长(stride)

滑动的步长,stride,记为S

步长取值

S越小,提取的特征 越多,但是S 一般 不取1,主要考虑 时间效率 的问题。

S也 不能太大,否则会 漏掉 图像上的信息。

导致的结果

  • S 越小,生成的图像越大
  • S 越大,生成的图像越小

feature map

在输入层

图片有 几个通道 就有 几个 feature map:

  • 灰度图片,只有一个feature map;
  • 彩色图片,一般就是3个feature map(红绿蓝)。

其它层

上一层 每个feature map 跟 每个卷积核 做卷积,都会产生下一层的 一个feature map,有N个卷积核,下层就会产生 N个feather map。

多个feather map的作用是什么?

用 多种不同 的 卷积核 对图像进行卷积,提取不同的特征

也就是说 卷积核 越多,提取的 特征越多,生成的feather map 数量越多

问题

1. 图像边缘信息容易丢失

一般,每次移动滑窗后 有交集部分,交集部分意味着 多次提取特征,尤其在图像的 中间区域 提取次数 较多,边缘部分 提取次数 较少

如下图,越是中间的部分,计算次数越多;越是边、角的部分,计算次数越少
左侧 第1列 和 右侧 最后1列,只运算过 1次,中间区域 运算过 3次

2. 图像缩小

每次卷积,图像都缩小,这样卷不了几次就没了

边缘填充(padding)

为了解决上面的问题,采用 边缘填充

当卷积核大小为3*3时,边缘填充 两圈0,6*6的原始图像 填充成 10*10的新图像,经过 卷积核 运算后,生成的图像 大小没变,如下图:

两种方式

  1. valid。不填充,卷积后图片会变小
  2. same。在图片周围填充0,卷积后图片大小不变
    填充层数为:(卷积核高度-1)/2,所以卷积核的大小通常为奇数

卷积核计算公式

  • S是strides(滑动步长)
  • 原图片大小为N1xN1(下图为4x4)
  • 卷积核大小为N2xN2(下图为3x3)
  • P是padding大小

卷积后图像大小:(N1-N2+2P)/S+1

动画演示

https://gitee.com/65242847/images/blob/master/%E5%8D%B7%E7%A7%AF%E5%8A%A8%E7%94%BB%E5%9B%BE.md

特点

卷积神经网络通过 局部感知 和 权值共享 可以降低参数数量,减少运算量

1. 局部感知

理念来源于动物视觉的皮层结构,图像中,距离 较近 的像素间 相关性强,距离 较远 则 相关性弱

每一个神经元只需要感知图像中的 局部信息,然后在更高层进行信息组合就可以得到 全局信息

2. 权值共享(参数共享)

在卷积过程中,卷积核的权重不改变

通过一个卷积核,提取一个图像不同部分的特征时,该卷积核的 权重不变

keras

一般使用 tf.keras.layers.Conv2D

总结

卷积层的作用:对图像特征的提取


感谢:
https://blog.csdn.net/weixin_39549734/article/details/82734115

https://www.cnblogs.com/xiaojianliu/articles/9904141.html

https://blog.csdn.net/u013555719/article/details/81121005

https://www.jianshu.com/p/c0215d26d20a

https://www.cnblogs.com/jyxbk/p/7879834.html

https://www.cnblogs.com/wj-1314/p/9593364.html

https://cloud.tencent.com/developer/news/131400


原文出处:/show_1EF49Jg1D6Pm.html