卷积神经网络一些计算上的总结,原文链接如下
卷积神经网络相关计算总结,都在这了 | AI柠檬https://blog.ailemon.net/2020/10/12/cnn-calculation-summary/
valid卷积
最常用的下采样卷积,特点是卷积核不能够超出特征图的范围,如下图,在卷积核为3×3且步长为1,且不会在周边增加扩充值的情况下,一个5×5的特征图经过卷积后,变成了3×3的尺寸大小。
输出的特征图维度 Doutput 计算式为:
分母Skernel代表卷积核的步长,Dkernel 代表卷积核的维度, Padding 代表扩充值的维度。
full卷积
典型上采样卷积,卷积核可以超出特征图的范围,但是卷积核的边缘需要和特征图的边缘有交点。如下图,这种卷积将如图的2×2的特征图,在经过尺寸为3×3、步长为1的卷积核卷积后,变成了4×4的特征图。其输出特征维度的计算仍然满足式1,即valid卷积当中的计算公式
SAME卷积
介于full卷积和valid卷积之间的一种卷积方式,其特点是卷积前后特征图的尺寸不变
其padding值的设置是固定的,可以通过1式进行推导,n代表输入或者输出特征图的尺寸
还可以借助下面的例子来表示其卷积的计算方式
反卷积层
常用的上采样方法
可把图像恢复到卷积之前的尺寸,输出尺寸的计算式 并且Skernel不等于1
反卷积操作过程:先对输入进行填充,再进行正常的卷积操作。假设输入特征图如下,
以及3*3的卷积核
如果假设Skernel=1,Padding=’SAME‘,那么在输入特征图的每个点周围不需要填充0,只需要在周边补0
看上去和FULL卷积类似,但是所表达的意义不同。当 Skernel=2 ,Padding=”SAME”时,首先时在每个输入的元素之间填充0,个数为: Skernel–1
如果设置输出的尺寸为5×5,那么使计算的输出尺寸与设置的输出尺寸相同,那么输出为:
整个计算的演示过程如下
如果输出尺寸为6×6,使计算的输出尺寸比设置的输出尺寸小且宽和高各相差1,那么还需要对输入的右列和下行填充0,如图
理解卷积网络需要理解中间层的特征值,反卷积网络提供了这种方法。反卷积网络当中每一层可以看作是卷积网络当中对应层的逆过程,有同样的卷积核和池化索引。反卷积的过程是把特征值逆向映射到了输入图片的像素空间,借此说明图当中哪些像素激活了该特征值。
(这部分反卷积网络及其相关内容来自下面的链接内容,感觉比较清楚,故而搬运过来了“直观理解”卷积神经网络(一):反卷积(Deconvnet) - 知乎“直观理解”卷积神经网络(一):反卷积(Deconvnet)本文整理/翻译自论文 "Visualizing and Understanding Convolutional Networks",假如文中观点有误,欢迎讨论/指正! #***文章大纲***# 1.简介 2.卷积网…https://zhuanlan.zhihu.com/p/140896660 下图将卷积网络和反卷积网络的过程合并,展示了两者各层之间的关系,且两者在整体上互为逆过程:首先,卷积网络将一张图片作为输入,计算得到各层的特征表示;为了验证某层一个具体的特征值,我们将该层特征值之外的所有值置零后,将其作为反卷积网络的输入,经过反卷积网络每一层的操作,该特征值被映射回了输入图片的像素空间.
反卷积网络的构成
1.反池化操作
对应卷积网络的池化,理论上,卷积网络中的最大池化操作是不可逆的,但我们可以通过池化索引进行近似可逆。下图是反池化过程:
2. 矫正
对应卷积网络的ReLU操作,卷积网络中采用ReLU确保特征值非负,为了确保正逆过程的一致性,我们将反卷积网络每一层的重构特征也通过ReLU得到非负值。
3. 反卷积
对应卷积网络的卷积操作,卷积操作是低效操作,主流神经网络框架都是通过im2col+矩阵乘法来实现卷积,以空间换效率。输入中每个卷积窗口内的元素被拉直成为单独的一列,这样输入就转化为了H_out * W_out列的矩阵,im2col由来是如此。简单来说, 就是以步长为1进行滑动生成子矩阵, 子矩阵大小为[m n]. 所以B中的每一个列都是子矩阵.
把卷积核也拉成一列之后,左乘输入矩阵,得到卷积结果。im2col和矩阵乘法见如下两图
上面提到的反卷积实际上也是转置卷积,神经网络框架借助转置卷积实现反向传播,如下图。把卷积核的矩阵进行转置之后,左乘梯度输出gradoutput,得到梯度列矩阵,GradColumns,再借助col2im把其还原到输入的大小,就可以得到了相对输入的梯度GradInput
总觉得col2im的过程有些不太清楚为何是相加的,稍后补上
梯度的反向传播一般用于卷积网络的训练过程,通过梯度更新权重和偏正取值;而本文转置卷积不是用于梯度反向传播,操作对象不是梯度而是特征值。
池化层
通常有:最大池化、平均池化、重叠池化、空间金字塔池化
最大池化:每次从中取得最大值当作输出结果,以滤波器大小为2×2以及步长为2为例,如下图所示。
平均池化:几个数平均值后作为输出结果,如下图
重叠池化:在进行上面两种池化的时候,池化的尺寸>步长。滤波器在移动时候,会有重叠。当上述两种池化步长为1时,输出尺寸为3×3而不是2×2。
空间金字塔池化
可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping裁剪和warping变形扭曲的操作,导致一些信息的丢失,具有非常重要的意义。一般的CNN都需要输入图像的大小是固定的,这是因为全连接层的输入需要固定输入维度,但在卷积操作是没有对图像尺度有限制,所有作者提出了空间金字塔池化,先让图像进行卷积操作,然后转化成维度相同的特征输入到全连接层,这个可以把CNN扩展到任意大小的图像。
感受野
是某一层输出结果中,一个元素(点)所对应的输入层的区域。感受野的计算式为:
rin表示输入特征图的感受野大小,k表示卷积核的大小, jin表示两个连续的特征之间的距离,有
可以看到感受野的计算是一个递推的关系
以该图为例,各层的kernel size、padding、stride超参数已在图中标出,右侧图为feature map和感受野中心对齐后的结果。第二层对应的第一层上的感受野大小为
rout=1+(3−1)×1=3,同样,第三层对应第一层上的感受野大小为 rout=3+(3−1)×2=7 。
好像了解了但是还没有完全了解
权重数量计算
卷积层权重数量的计算和该层的卷积核尺寸,是否加了偏置项,卷积核个数、输入层特征深度有关系。公式如下
depthin 输入层特征深度
kh,卷积核尺寸的第一维
kw,卷积核尺寸第二维
bias,是否使用偏置项,有1,无0
kernel,该层卷积核个数。也就是输出特征图的深度
比如,输入层的特征图维度是(224, 224, 3),第一层卷积的配置为:卷积核尺寸为3×3,使用bias项,卷积核个数为32,那么,该层的权重数量=3×(3×3+1)×32=960。
而卷积神经网络的总参数量只需要使用该方法计算所有卷积层权重数量,以及其他层权重数量之后加和即可得到。