[CNN] 卷积、反卷积、池化、反池化「建议收藏」

[CNN] 卷积、反卷积、池化、反池化「建议收藏」之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积、反卷积、池化、反池化的内容。一、卷积1、卷积的简单定义卷积神经网络中的卷积操作可以看做是输入和卷积核的内积运算。其运算过程非常容易理解,下面会有详细解释。2、举例解释(1)为了方便直接解释,我们首先以一个通道为例进行讲解,首先明确概念:1)输入是一个5*5的图片,其像素值如下:[11100011100011100110011…

大家好,又见面了,我是你们的朋友全栈君。

之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积、反卷积、池化、反池化的内容,也希望自己对一些比较模糊的地方可以理解的更加清晰。

一、卷积

1、卷积的简单定义

卷积神经网络中的卷积操作可以看做是输入和卷积核的内积运算。其运算过程非常容易理解,下面有举例。

2、举例解释

(1)为了方便直接解释,我们首先以一个通道(若是彩图,则有RGB的颜色,所以是三个通道)为例进行讲解,首先明确概念:

1) 输入是一个5*5的图片,其像素值如下:
[ 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 ] \begin{bmatrix} 1 & 1 &1 & 0 & 0\\ 0 & 1 & 1 &1 & 0\\ 0 & 0 & 1 & 1 & 1\\ 0 & 0 & 1 & 1 &0 \\ 0 &1 &1 & 0 &0 \end{bmatrix} 1000011001111110111000100
2)卷积核(kernel)是需要训练的参数,这里为了讲解卷积运算的操作,所以最开始我们假设卷积核的值如下:
[ 1 0 1 0 1 0 1 0 1 ] \begin{bmatrix} 1 & 0 &1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \\ \end{bmatrix} 101010101
3)通过窗口和卷积核的内积操作得到的结果叫做feature map。

(2)如下图所示(对应的是上面提到的数据),我们在输入图片上框出一个和卷积核相同大小的区域,基于此计算子区域和卷积核对应元素乘积之和:
注: 本节图形来自对FCN及反卷积的理解


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

1 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 = 4 1*1 + 1*0+1*1+0*0+1*1+1*0+0*1+0*0+1*1=4 11+10+11+00+11+10+01+00+11=4
所以feature map的第一个元素值为4。

(3)接着计算第二个子区域和卷积核的对应元素乘积之和,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 = 3 1*1+1*0+0*1+1*0+1*1+1*0+0*1+1*0+1*1=3 11+10+01+10+11+10+01+10+11=3
所以feature map的第二个元素值为3。

(4)接着计算第三个子区域和卷积核的对应元素乘积之和,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

1 ∗ 1 + 0 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 = 4 1*1+0*0+0*1+1*0+1*1+0*0+1*1+1*0+1*1=4 11+00+01+10+11+00+11+10+11=4
所以feature map的第三个元素值为4。

(5)接着计算第四个子区域和卷积核的对应元素乘积之和,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 = 2 0*1+1*0+1*1+0*0+0*1+1*0+0*1+0*0+1*1=2 01+10+11+00+01+10+01+00+11=2
所以feature map的第四个元素值为2。

(6)以此类推,不断执行,最后得到的feature map如下:

[ 4 3 4 2 4 3 2 3 4 ] \begin{bmatrix} 4 & 3&4 \\ 2 & 4 & 3 \\ 2& 3 & 4 \\ \end{bmatrix} 422343434
(7)下面的动图可以连贯的展示上面的过程,可以帮助更直观的理解:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

3、多个输入通道

若输入含有多个通道,则对于某个卷积核,分别对每个通道求feature map后将对应位置相加得到最终的feature map,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

4、多个卷积核

若有多个卷积核,则对应多个feature map,也就是下一个输入层有多个通道。如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

5、步数的大小

上述展示的步长为1的情况,若步长为2,则滑动窗口每2步产生一个,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

输入大小为 5 ∗ 5 5*5 55,卷积核的大小为 3 ∗ 3 3*3 33,第一个滑动窗口为红色部分,第二个滑动窗口为绿色部分,第三个滑动窗口为紫色部分,第四个滑动窗口为蓝色部分,所以最后的feature map的大小为 2 ∗ 2 2*2 22

若假设输入大小是 n ∗ n n*n nn,卷积核的大小是 f ∗ f f*f ff,步长是 s s s,则最后的feature map的大小为 o ∗ o o*o oo,其中 o o o如下:
o = ⌊ n − f s ⌋ + 1 o=\left \lfloor \frac{n-f}{s} \right \rfloor+1 o=snf+1

6、三种模式:Full,Same和Valid


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

如上图所示,3种模式的主要区别是从哪部分边缘开始滑动窗口卷积操作,区别如下:

Full模式:第一个窗口只包含1个输入的元素,即从卷积核(fileter)和输入刚相交开始做卷积。没有元素的部分做补0操作。
Valid模式:卷积核和输入完全相交开始做卷积,这种模式不需要补0。
Same模式:当卷积核的中心C和输入开始相交时做卷积。没有元素的部分做补0操作。

在之前讲到的内容使用的是Valid的模式。

6、Full,Same和Valid下的feature map的大小

(1)若输入大小是 n ∗ n n*n nn,卷积核大小为 f ∗ f f*f ff,步长为 s s s,若采用Full或Same模式,假设填充大小为 p p p p p p为一边填充的大小,举例:如果输出 5 ∗ 5 5*5 55,卷积核 3 ∗ 3 3*3 33,采用Full模式,则 p = 2 p=2 p=2),则feature map的大小是: ( ⌊ n + 2 p − f s ⌋ + 1 ) ∗ ( ⌊ n + 2 p − f s ⌋ + 1 ) (\left \lfloor \frac{n+2p-f}{s} \right \rfloor+1)*(\left \lfloor \frac{n+2p-f}{s} \right \rfloor+1) (sn+2pf+1)(sn+2pf+1)
(2)若输入大小是 n ∗ n n*n nn,卷积核大小为 f ∗ f f*f ff,步长为 s s s,若不补0,即Valid模式下,feature map的大小为: ( ⌊ n − f s ⌋ + 1 ) ∗ ( ⌊ n − f s ⌋ + 1 ) (\left \lfloor \frac{n-f}{s} \right \rfloor+1)*(\left \lfloor \frac{n-f}{s} \right \rfloor+1) (snf+1)(snf+1)
(3)Same模式下,feature map的维度和输入维度相同。

注意:卷积核大小一般为奇数,原因如下:

①当卷积核为偶数时,p不为整数,假设是Same模式,若想使得卷积之后的维度和卷积之前的维度相同,则需要对图像进行不对称填充,较复杂。
②当kernel为奇数维时,有中心像素点,便于定位卷积核。

5、卷积特点

(1)局部视野
卷积操作在运算的过程中,一次只考虑一个窗口的大小,因此其具有局部视野的特点,局部性主要体现在窗口的卷积核的大小。
(2)参数减少
比如,在上述输入为 5 ∗ 5 5*5 55,卷积核为 3 ∗ 3 3*3 33,输出为 3 ∗ 3 3*3 33的例子中,如果是使用NN,则其参数个数为 ( 5 ∗ 5 ) ∗ ( 3 ∗ 3 ) (5*5)*(3*3) (55)(33)。而在CNN中,其参数个数为卷积核的大小 3 ∗ 3 3*3 33
这只是简单的情况,若输入非常大,卷积核通常不是很大,此时参数量的差距将会非常明显。
(3)权重共享
从上面的讲解可以看到,对一个输入为 5 ∗ 5 5*5 55,卷积核为 3 ∗ 3 3*3 33的情况下,对于每一个滑动窗口,使用的都是同一个卷积核,所以其参数共享。
(4)多个卷积核可以发现不同角度的特征,多个卷积层可以捕捉更全局的特征(处于卷积网络更深的层或者能够的单元,他们的接受域要比处在浅层的单元的接受域更大)。详见下图(图片来源:花书):


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

可以看到, h 2 h_2 h2的接受域是 x 1 , x 2 , x 3 x_1, x_2,x_3 x1,x2,x3,而 g 3 g_3 g3的接受域是 x 1 , x 2 , x 3 , x 4 , x 5 x_1, x_2,x_3,x_4,x_5 x1,x2,x3,x4,x5

二、反卷积

为了更深度的了解反卷积,现在还来看下卷积的数学操作。

1、卷积的数学操作
上述是比较直观的图形展示的例子,如果把卷积操作写成矩阵相乘,则对于 4 ∗ 4 4*4 44的输入和 3 ∗ 3 3*3 33的卷积核的结果如下:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

[ c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 0 0 0 0 0 0 c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 0 0 0 0 0 0 0 0 c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 0 0 0 0 0 0 c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 ] [ x 11 x 12 x 13 x 14 x 21 x 22 x 23 x 24 x 31 x 32 x 33 x 34 x 41 x 42 x 43 x 44 ] = [ y 11 y 12 y 21 y 22 ] \begin{bmatrix} c_{11} & c_{12} &c_{13} & 0 & c_{21} & c_{22} & c_{23} & 0 & c_{31} & c_{32} & c_{33} & 0 & 0 &0 & 0 & 0\\ 0 & c_{11} & c_{12} &c_{13} & 0 & c_{21} & c_{22} & c_{23}& 0 & c_{31} & c_{32} & c_{33} & 0 & 0 &0 & 0 \\ 0 & 0 &0 & 0 & c_{11} & c_{12} &c_{13} & 0 & c_{21} & c_{22} & c_{23}& 0 & c_{31} & c_{32} & c_{33} & 0 \\ 0 & 0 &0 & 0 & 0 & c_{11} & c_{12} &c_{13}& 0 & c_{21} & c_{22} & c_{23} & 0 & c_{31} & c_{32} & c_{33} \end{bmatrix}\begin{bmatrix} x_{11}\\ x_{12}\\ x_{13}\\ x_{14}\\ x_{21}\\ x_{22}\\ x_{23}\\ x_{24}\\ x_{31}\\ x_{32}\\ x_{33}\\ x_{34}\\ x_{41}\\ x_{42}\\ x_{43}\\ x_{44} \end{bmatrix}=\begin{bmatrix} y_{11}\\ y_{12}\\ y_{21}\\ y_{22} \end{bmatrix} c11000c12c1100c13c12000c1300c210c110c22c21c12c11c23c22c13c120c230c13c310c210c32c31c22c21c33c32c23c220c330c2300c31000c32c3100c33c32000c33x11x12x13x14x21x22x23x24x31x32x33x34x41x42x43x44=y11y12y21y22
最后得到一个 4 ∗ 1 4*1 41的矩阵,可以reshape成 2 ∗ 2 2*2 22的矩阵,便是最后卷积的结果。

2、反卷积的数学操作
反卷积的操作就相当于对上述 y y y左乘 c T c^T cT,维度如下: c T c^T cT的维度是 16 ∗ 4 16*4 164 y y y的维度是 4 ∗ 1 4*1 41,故 c T y c^Ty cTy的维度是 16 ∗ 1 16*1 161,可以将其reshape成 4 ∗ 4 4*4 44便变回了原来的维度。

3、反卷积和卷积的关系
反卷积就是特殊的卷积,是使用Full模式的卷积操作,便可以将输入还原,在tensorFlow中,反卷积的操作也是卷积操作。
注意:
在卷积操作中: c x = y cx=y cx=y
在反卷积操作中: c T y = x c^Ty=x cTy=x,这里并不是严格意义上的等于,而只是维度的相等,因为 c c c c T c^T cT都是训练,并不是直接取转置。


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

三、池化

池化的定义比较简单,最直观的作用便是降维,常见的池化有最大池化、平均池化和随机池化。
池化层不需要训练参数。

1、三种池化示意图

最大池化是对局部的值取最大;平均池化是对局部的值取平均;随机池化是根据概率对局部的值进行采样,采样结果便是池化结果。概念非常容易理解,其示意图如下所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

2、三种池化的意义

(1)最大池化可以获取局部信息,可以更好保留纹理上的特征。如果不用观察物体在图片中的具体位置,只关心其是否出现,则使用最大池化效果比较好。
(2)平均池化往往能保留整体数据的特征,能凸出背景的信息。
(3)随机池化中元素值大的被选中的概率也大,但不是像最大池化总是取最大值。随机池化一方面最大化地保证了Max值的取值,一方面又确保了不会完全是max值起作用,造成过度失真。除此之外,其可以在一定程度上避免过拟合。

3、重叠池化

一般在CNN中使用的池化都是不重叠的,但是池化也可以重叠,重叠池化和卷积操作类似,可以定义步长等参数,其和卷积的不同在于:卷积操作将窗口元素和卷积核求内积,而池化操作求最大值/平均值等,窗口的滑动等原理完全相同。

四、反池化

池化操作中最常见的最大池化和平均池化,因此最常见的反池化操作有反最大池化和反平均池化,其示意图如下:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

反最大池化需要记录池化时最大值的位置,反平均池化不需要此过程。

五、参考文章:

[1] A guide to convolution arithmetic for deep learning
[2] 深度学习(书)
[3] deeplearning(ng)
[4] https://github.com/vdumoulin/conv_arithmetic
[5] 深度理解反卷积操作

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142865.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月22日 下午8:00
下一篇 2022年5月22日 下午8:20


相关推荐

  • Cursor AI编辑器深度解析:15个核心功能实战应用指南

    Cursor AI编辑器深度解析:15个核心功能实战应用指南

    2026年3月16日
    1
  • idea2021激活码(破解版激活)

    idea2021激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    105
  • python环境配置系统版及pycharm编译器

    python环境配置系统版及pycharm编译器python 环境配置 1 系统自带的 python exe 或者自己下载的 2 下载 anaconda 自带的 python exepycharm 中如何使用环境 选择 File gt setting gt PythonInterp gt 点右边的设置标志 Add gt 然后可以选择虚拟环境 这个是选择系统自带的 python exe 或者选择 Conda 环境 有新建环境和已存在的环境 点新建环境可以直接处男建一个 conda 环境 python 版本也可以指定 自动下载 已存在的环境的话就是

    2026年3月19日
    3
  • 目前最简单的OpenClaw+飞书+模型配置,养虾进入零配置时代

    目前最简单的OpenClaw+飞书+模型配置,养虾进入零配置时代

    2026年3月12日
    5
  • java二分法排序算法_Java中使用二分法排序

    java二分法排序算法_Java中使用二分法排序在数据结构中学习过关于二分法排序的算法 但都是基于 C 语言或者 C 使用指针的方法 自己因为要在项目中使用到此算法 才开始将原有的程序改写为 Java 语言的 具体的说明如下 1 二分法查找插入位置如果 R i 2 后移虽然我们很清楚的知道 我们需要后移那些排序码大于 R i 的记录 但难免会问自己这样几个问题 其实它相当于需要移动从 i 1 到左指针的记录 3 插入由 1 中得到的左指针其实就是元素要插入的位置

    2026年3月17日
    2
  • datagrid()_propertygrid控件

    datagrid()_propertygrid控件鉴于在本版收到好多asp.net初学者因为不了解ItemDataBound事件的用法而提出问题,特写此实例教程,以飨众友。实例:现要把如下的数据集(在查询管理器的查出来的结果集)绑定到DataGrid:绑定结果为——然而现在要实现如下效果:一、第一列的产品名是一个链接,它要求链接目标为:prod.aspx?name={产品名称}&spec={产品规格}二、当产品单价>=1元时,将其单价显示为红

    2022年10月13日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号