卷积神经网络CNN
神经元结构
神经元是由一个线性函数和一个非线性的激活函数(改变数据的线性关系,并且将输入数据映射在某个范围内,防止数据过大溢出)构成
全连接
每一层的每个神经元都与下一层的每个神经元相连,这种连接关系成为全连接(FC)。
缺点:
- 所有神经元都要与下层的神经元有关系,而不管它们相隔多远(不管多么微小的特征都要通过网络计算并传播下去)
- 计算量大
感受野
神经网络中神经元"看到的"输入区域(感受局部图像区域),在神经网络中,feature map 上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野
例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aeawHimF-1616922587765)(卷积神经网络CNN.assets/v2-3d65c62f0c5e96b40f80e7b30e49f99e_720w.jpg)]
卷积神经网络中,越深层的神经元看到的输入区域越大,如下图所示,kernel size 均为3×3,stride均为1,绿色标记的是Layer2每个神经元看到的区域,黄色标记的是Layer3 看到的区域,具体地,Layer2每个神经元可看到Layer1上3×3 大小的区域,Layer3 每个神经元看到Layer2 上3×3 大小的区域,该区域可以又看到Layer1上5×5 大小的区域。
故,感受野是个相对概念,某层feature map 上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域
感受野的计算
约定
在正式计算前,先对数学符号做如下约定,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iNyDXGW6-1616922587766)(卷积神经网络CNN.assets/v2-b90027b4658bdb289fc3053509afd670_720w.jpg)]
- k:kernel size(卷积核尺寸)
- p:padding size(填充)
- s:stride size(步长)
- Layer:用Layer表示feature map(特征图),特别地,Layer0为输入图像;
- Conv:用Conv表示卷积,k、p、s为卷积层的超参数,Convl的输入和输出分别为Layerl−1和Layerl+1;
- n:feature map size为n×n,这里假定height=width;
- r:receptive field size为r×r,这里假定感受野为方形;
- j:feature map上相邻元素间的像素距离,即**将feature map上的元素与输入图像Layer0 上感受野的中心对齐后,相邻元素在输入图像上的像素距离,也可以理解为 feature map上前进1步相当于输入图像上前进多少个像素,**如下图所示,feature map上前进1步,相当于输入图像上前进2个像素,j=2;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BxeNDW9-1616922587767)(卷积神经网络CNN.assets/v2-d552433faa8363df84c53b905443a556_b.gif)]
- start:feature map左上角元素在输入图像上的感受野中心坐标(start,start),即视野中心的坐标,在上图中,左上角绿色块感受野中心坐标为(0.5,0.5),即左上角蓝色块中心的坐标,左上角白色虚线块中心的坐标为(−0.5,−0.5);
- l:l表示层,卷积层为Convl,其输入feature map为Layerl−1,输出为Layerl。
下面假定所有层均为卷积层
感受野大小的计算是个递推公式
再看上面的动图,如果feature map Layer 2 上的一个元素看到feature map Layer 1 上的范围为3 x 3 (图中绿色块) , 其大小等于kernel size k2所以,A看到的感受野范围 r2 等价于 Layer 1上3 x 3窗口看到的 Layer 0 范围,据此可以建立起相邻Layer感受野的关系,如下所示, 其中 r1为 Layerl的感受野,rl-1为 Layer l-1的感受野,
rl当前层l的感受野大小,rl-1为 Layer l-1的感受野大小,kl是当前层l的卷积核大小,j为卷积步长
r
l
=
r
l
−
1
+
(
k
l
−
1
)
∗
j
l
−
1
r_{l}=r_{l-1}+(k_{l}-1)*j_{l-1}
rl=rl−1+(kl−1)∗jl−1
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KD2Waf0e-1616922587769)(https://www.zhihu.com/equation?tex=Layer+l+)] 一个元素的感受野 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmxWY2CI-1616922587770)(https://www.zhihu.com/equation?tex=r_l)] 等价于 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4loeQ46-1616922587771)(https://www.zhihu.com/equation?tex=Layer+l%E2%88%921+)] 上 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TS5coPx9-1616922587771)(https://www.zhihu.com/equation?tex=k%C3%97k)] 个感受野的叠加;
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-urlOx1yA-1616922587772)(https://www.zhihu.com/equation?tex=Layerl%E2%88%921+)] 上一个元素的感受野为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rrn9uN37-1616922587772)(https://www.zhihu.com/equation?tex=r_%7Bl%E2%88%921%7D)] ;
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yldhMqKA-1616922587773)(https://www.zhihu.com/equation?tex=Layerl%E2%88%921+)]上连续k个元素的感受野可以看成是,第1个元素看到的感受野加上剩余k−1步扫过的范围, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f2xV1kRA-1616922587774)(https://www.zhihu.com/equation?tex=Layerl%E2%88%921+)]上每前进1个元素相当于在输入图像上前进jl-1 个像素,结果等于 r l − 1 + ( k l − 1 ) ∗ j l − 1 r_{l-1}+(k_{l}-1)*j_{l-1} rl−1+(kl−1)∗jl−1
可视化如下图所示,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfF5Df5z-1616922587774)(卷积神经网络CNN.assets/v2-946b233c36abacb508a3744643e1b473_r.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FElwcEan-1616922587775)(https://www.zhihu.com/equation?tex=Layer+l+)]上前进1个元素相当于[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Z9NIUIU-1616922587775)(https://www.zhihu.com/equation?tex=Layerl%E2%88%921+)]上前进sl个元素,转换成像素单位为
j
l
=
j
l
−
1
∗
s
l
j_{l}=j_{l-1}*s_{l}
jl=jl−1∗sl
其中,sl为第l层的卷积步长,是第l卷积层的卷积核在输入特征图上滑动的步长,输入图像的s0=1.根据递推公式可知,
j
l
=
∏
i
=
1
l
s
i
j_{l}=\prod_{i=1}^{l}s_{i}
jl=i=1∏lsi
当前层上前进1个元素,相当于在输入图像前进了
∏
i
=
1
l
s
i
\prod_{i=1}^{l}s_{i}
∏i=1lsi个像素,即前面所有层的步长的连乘。
故当前层感受野大小计算公式为
r
l
=
r
l
−
1
+
(
k
l
−
1
)
∗
∏
i
=
0
l
−
1
s
i
r_{l}=r_{l-1}+(k_{l}-1)*\prod_{i=0}^{l-1}s_{i}
rl=rl−1+(kl−1)∗i=0∏l−1si
其中rl-1位第l-1层的感受野大小,kl为第l层的卷积核大小(也可以是池化层核),si为第i层的卷积步长。一般来说r0=1,s0=1.
感受野中心
感受野中心计算公式:(左上角)
s
t
a
r
t
l
=
s
t
a
r
t
l
−
1
+
(
k
l
−
1
2
−
p
l
)
∗
∏
i
=
0
l
−
1
s
i
start_{l}=start_{l-1}+(\frac{k_{l}-1}{2}-p_{l})*\prod_{i=0}^{l-1}s_{i}
startl=startl−1+(2kl−1−pl)∗i=0∏l−1si
上述公式计算的是第l层特征图左上角对应的感受野中心(默认卷积核的长宽一致,即中心的x和y坐标均等于上述公式的结果)。其中,startl-1是第l-1层特征图左上角对应的感受野中心坐标,kl为第l层卷积核的大小,pl为第l层卷积的padding大小,si为第i层卷积的步长。一般来说start0=0,s0=1.
其他位置的感受野中心
s
t
a
r
t
l
n
=
s
t
a
r
t
l
+
n
∗
∏
i
=
0
l
s
i
start^{n}_{l}=start_{l}+n*\prod_{i=0}^{l}s_{i}
startln=startl+n∗i=0∏lsi
s t a r t l m = s t a r t l + m ∗ ∏ i = 0 l s i start^{m}_{l}=start_{l}+m*\prod_{i=0}^{l}s_{i} startlm=startl+m∗i=0∏lsi
上述公式计算的是第l层特征图坐标为(n,m)位置处对应的感受野中心。n和m的索引从0开始。需要注意的是,连乘项 ∏ i = 0 l s i \prod_{i=0}^{l}s_{i} ∏i=0lsi的上标是l(包含当前层的步长)。
卷积层
每个神经元局部连接上一层的神经元,并且共享权值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b072D7iT-1616922587776)(卷积神经网络CNN.assets/v2-89feb22fbdb50d910575ebce8b59cf59_r.jpg)]
卷积层中进行的处理叫卷积运算,相当于图像处理中的滤波器运算,用来做卷积运算的东西叫卷积核
卷积过程
下面蓝色的表示输入数据,蓝色上有3 x 3 大小的阴影面积的是卷积核,每一次卷积操作则将卷积核上的每个元素和对应输入数据的元素相乘,最后把所有的结果相加,即为本次卷积的结果(一个绿色),然后将卷积核移动一个**步长(stride)**接着下一次卷积,直到卷积核遍历完输入数据即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpJzTOiI-1616922587776)(卷积神经网络CNN.assets/v2-705305fee5a050575544c64067405fce_b.gif)]
卷积核(filter过滤器)
我们提取的某一方面的特征,通过卷积核把图片中数据的这方面的特征过滤出来
- 卷积核大小可以指定为小于输入图像尺寸的任意值,卷积核越大,可提取的输入特征越复杂
- 卷积核用来检测某一方面的特征,比如垂直边界、水平边界,倾斜45°的边界等特征,又称为过滤器
卷积神经网络CNN参数
- 卷积核大小
- 填充
- 步长
三者共同决定了卷积层输出特征图的尺寸
卷积
f ( x ) ∗ g ( x ) = ∫ − ∞ + ∞ f ( a ) g ( x − a ) d f(x)*g(x)=\int_{-∞}^{+∞}f(a)g(x-a)d f(x)∗g(x)=∫−∞+∞f(a)g(x−a)d
用卷积核将相邻像素之间的"轮廓"过滤出来
填充(Padding)
填充是将输入图像的边缘用0填充
填充为1时,向周围填充一圈,填充为2时,向周围填充两圈
一个n x n的图像经过f x f的卷积核处理后
- 图像变小了,如果神经网络层数越来越多,会越来越小
- 边缘部分的信息用到很少
图像 卷积核 图像输出
5x5 * f:3 x 3 → 3 x 3
怎样实现输入图像和输出图像大小一致?
填充(padding) p=(f-1)/2
步长(Stride)
卷积时是通过一步一步的移动卷积核窗口将图像卷积完成,一般一次只移动一格,实际上移动的步伐可以迈得更大,这个步伐的长度就叫做步长
卷积输出大小计算
不同的卷积核大小,不同的填充大小,不同的步长都会影响输出数据的尺寸
公式(单通道)
假设 输入图像n x n ,过滤器f x f ,填充p,步长s,则输出
O
=
(
n
−
f
+
2
p
)
/
s
+
1
O=(n-f+2p)/s+1
O=(n−f+2p)/s+1
多通道
卷积核的通道一定要等于输入数据的通道,而其它都是一样的,比如卷积过程是一样的,只不过数据在处理时多算了一个维度,此外,输出数据的尺寸计算上述公式同样适用,通道是不影响输出数据的尺寸.下图省略了 1 个偏置,输出数据的每个元素应该加上这个偏置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7bnHhKi-1616922587777)(卷积神经网络CNN.assets/v2-e329939833b3e7d1a5416063685ffedb_r.jpg)]
通道(Channel)
有时候你不仅想检测灰度图像的特征,也向检测RGB彩色图像的特征,一般彩色图像有三个颜色通道,对应红绿蓝三种颜色,我们称为通道(Channel)
不管输入数据是单通道还是多通道,输出数据依旧是单通道.这是因为我们只用了一个卷积核,也就是说卷积核的数量 = 输出数据的通道数,即一个卷积核对应一个通道的输出数据.另外,每个通道的输出数据也对应一个偏置进行相加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEPTywtw-1616922587778)(卷积神经网络CNN.assets/v2-f6923c5a955f21bc40efb8216ea50b41_r.jpg)]
多过滤器(Multipe Filters)
当检测不同特征时,可以采用多过滤器(Multiple Filters),过滤器的个数决定输出图像的个数。
池化(Pooling)
池化(Pooling)的作用:降维(缩小数据尺寸的运算)。
常用最大池化(max-pooling)、平局池化(average-pooling)。
池化操作也有一个类似卷积核一样东西在特征图上移动,叫它池化窗口,所以这个池化窗口也有大小,移动的时候有步长,池化前也有填充操作,每次移动池化窗口一般要计算的是窗口里的最大值(Max)或者平均值(Average)。
池化的三个特征
- 没有要学习的参数,这和池化层不同.池化只是从目标区域中取最大值或者平均值,所以没有必要有学习的参数
- 通道数不发生改变,即不改变feature map的数量
- 它是利用图像局部相关性的原理,对图像进行子抽样,这样在保留有用信息的,对微小的位置变化具有鲁棒性(健壮), 输入数据发生微小偏差时, 池化仍会返回相同的结果
特征图
卷积层或者池化层的输入输出数据称为特征图(feature map),输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map),因此在卷积层中卷积核的数量是等于输出特征图的数量,因为我们知道一个卷积核提取一个特征.
Dropout
Dropout层的作用:防止CNN过拟合。
以一定的概率将神经元暂时从网络中丢弃。
深度可分离卷积(Depthwise separable convolution)
一些轻量级的网络,如mobilenet中,会有深度可分离卷积depthwise separable convolution,由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map。相比常规的卷积操作,其参数数量和运算成本比较低。
常规卷积操作
对于5x5x3的输入,如果想想要得到3x3x4的feature map,那么卷积核的shape为3x3x3x4(即:);如果padding=1,那么输出的feature map为5x5x4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-flUCjIZQ-1616922587778)(卷积神经网络CNN.assets/image.png)]
卷积层共4个Filter(过滤器),每个Filter包含了3个Kernel(卷积核),每个Kernel的大小为3×3。因此卷积层的参数数量可以用如下公式来计算(即:卷积核W x 卷积核H x 输入通道数 x 输出通道数):
N_std = 4 × 3 × 3 × 3 = 108
计算量(即:卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数 x 输出通道数):
C_std =33(5-2)*(5-2)34=972
深度可分离卷积
深度可分离卷积主要分为两个过程,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。
- 逐通道卷积(Depthwise Convolution)
Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样。
一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution首先经过第一次卷积运算,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map(如果有same padding则尺寸与输入层相同为5×5),如下图所示。(卷积核的shape即为:卷积核W x 卷积核H x 输入通道数)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6SVEbPHI-1616922587779)(卷积神经网络CNN.assets/4195)]
其中一个Filter只包含一个大小为3×3的Kernel,卷积部分的参数个数计算如下(即为:卷积核Wx卷积核Hx输入通道数):
N_depthwise = 3 × 3 × 3 = 27
计算量为(即:卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数)
C_depthwise=3x3x(5-2)x(5-2)x3=243
Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map。
- 逐点卷积(Pointwise Convolution)
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map。(卷积核的shape即为:1 x 1 x 输入通道数 x 输出通道数)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Exs9j17q-1616922587779)(卷积神经网络CNN.assets/4213)]
由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为(即为:1 x 1 x 输入通道数 x 输出通道数):
N_pointwise = 1 × 1 × 3 × 4 = 12
计算量(即为:1 x 1 x 特征层W x 特征层H x 输入通道数 x 输出通道数):
C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108
经过Pointwise Convolution之后,同样输出了4张Feature map,与常规卷积的输出维度相同。
四、参数对比
回顾一下,常规卷积的参数个数为:
N_std = 4 × 3 × 3 × 3 = 108
Separable Convolution的参数由两部分相加得到:
N_depthwise = 3 × 3 × 3 = 27
N_pointwise = 1 × 1 × 3 × 4 = 12
N_separable = N_depthwise + N_pointwise = 39
相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深。
五、计算量对比
回顾一下,常规卷积的计算量为:
C_std =33(5-2)*(5-2)34=972
Separable Convolution的计算量由两部分相加得到:
C_depthwise=3x3x(5-2)x(5-2)x3=243
C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108
C_separable = C_depthwise + C_pointwise = 351
相同的输入,同样是得到4张Feature map,Separable Convolution的计算量是常规卷积的约1/3。因此,在计算量相同的情况下,Depthwise Separable Convolution可以将神经网络层数可以做的更深。
普通卷积:
图1 普通卷积
上图为普通卷积示意图,图中只有一个卷积核,此时输入输出数据为:
输入feature map尺寸: W×H×C ,分别对应feature map的宽,高,通道数;
单个卷积核尺寸: k×k×C ,分别对应单个卷积核的宽,高,通道数;
输出feature map尺寸 :W’×H’ ,输出通道数等于卷积核数量,输出的宽和高与卷积步长有关,这里不关心这两个值。
参数量 p a r a m s = k 2 C params=k^{2}C params=k2C
运 算 量 F L O P s = k 2 C W ‘ H ‘ 运算量FLOPs=k^{2}CW`H` 运算量FLOPs=k2CW‘H‘,这里只考虑浮点乘数量,不考虑浮点加。
group convolution (分组卷积):
图2 分组卷积
将图一卷积的输入feature map分成组,每个卷积核也相应地分成组,在对应的组内做卷积,如上图2所示,图中分组数,即上面的一组feature map只和上面的一组卷积核做卷积,下面的一组feature map只和下面的一组卷积核做卷积。每组卷积都生成一个feature map,共生成个feature map。
输入每组feature map尺寸: W × H × C g W\times H\times\frac{C}{g} W×H×gC,共有g组;
单个卷积核每组的尺寸: k × k × C g k\times k\times\frac{C}{g} k×k×gC,一个卷积核被分成了[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w2SX81hr-1616922587781)(https://math.jianshu.com/math?formula=g)]组;
输出feature map尺寸: W ‘ × H ‘ × C g W`\times H`\times\frac{C}{g} W‘×H‘×gC,,共生成[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quvlMLyL-1616922587782)(https://math.jianshu.com/math?formula=g)]个feature map。
现在我们再来计算一下分组卷积时的参数量和运算量:
参数量
p
a
r
a
m
s
=
k
2
×
C
g
×
g
=
k
2
C
params=k^{2}\times\frac{C}{g}\times g=k^{2}C
params=k2×gC×g=k2C
运算量
p
a
r
a
m
s
=
k
2
×
C
g
×
W
‘
×
H
‘
×
g
=
k
2
C
W
‘
H
‘
params=k^{2}\times\frac{C}{g}\times W`\times H`\times g=k^{2}CW`H`
params=k2×gC×W‘×H‘×g=k2CW‘H‘
用了同等的参数量运算量生成了[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihiv9oar-1616922587782)(https://math.jianshu.com/math?formula=g)]个feature map
所以group conv常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature map,大量的feature map意味着能够编码更多的信息!
从分组卷积的角度来看,分组数[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vNasoDNQ-1616922587783)(https://math.jianshu.com/math?formula=g)]就像一个控制旋钮,最小值是1,此时g=1的卷积就是普通卷积;最大值是输入feature map的通道数C,此时g=C的卷积就是depthwise sepereable convolution,即深度分离卷积,又叫逐通道卷积
扩张卷积(空洞卷积 Dilated Convolutions)
扩张卷积引入另一个卷积层的参数被称为扩张率。这定义了内核中值之间的间距。扩张速率为2的3x3内核将具有与5x5内核相同的视野,而只使用9个参数。 想象一下,使用5x5内核并删除每个间隔的行和列。(如下图所示)
系统能以相同的计算成本,提供更大的感受野。扩张卷积在实时分割领域特别受欢迎。 在需要更大的观察范围,且无法承受多个卷积或更大的内核,可以才用它。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hyv4Uunc-1616922587783)(卷积神经网络CNN.assets/20190507101313742.gif)]
直观上,空洞卷积通过在卷积核部分之间插入空间让卷积核「膨胀」。这个增加的参数 l(空洞率)表明了我们想要将卷积核放宽到多大。下图显示了当 l=1,2,4 时的卷积核大小。(当l=1时,空洞卷积就变成了一个标准的卷积)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2IRGeLBt-1616922587784)(卷积神经网络CNN.assets/20190507105614293.png)]
在图像中,3 x 3 的红点表明经过卷积后的输出图像的像素是 3 x 3。虽然三次空洞卷积都得出了相同维度的输出图像,但是模型观察到的感受野(receptive field)是大不相同的。l=1 时,感受野为 3 x 3;l=2 时,感受野是 7 x 7;l=3 时,感受野增至 15x15。有趣的是,伴随这些操作的参数数量本质上是相同的,不需要增加参数运算成本就能「观察」大的感受野。正因为此,空洞卷积常被用以低成本地增加输出单元上的感受野,同时还不需要增加卷积核大小,当多个空洞卷积一个接一个堆叠在一起时,这种方式是非常有效的。
计算力(flops)和参数(parameters)
FLOPS:是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
FLOPs:是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
卷积层: ( 2 × C i × K 2 ) × H × W × C o (2\times C_{i}\times K^{2})\times H\times W\times C_{o} (2×Ci×K2)×H×W×Co
Ci=input channel, k=kernel size, HW=output feature map size, Co=output channel.
2是因为一个MAC算2个operations。
不考虑bias时有-1,有bias时没有-1。
上面针对一个input feature map,没考虑batch size。
理解上面这个公式分两步,括号内是第一步,计算出output feature map的一个pixel,然后再乘以HWCo拓展到整个output feature map。括号内的部分又可以分为两步, ( 2 × C i × K 2 − 1 ) = ( C i × K 2 ) + ( C i × K 2 − 1 ) (2\times C_{i}\times K^{2}-1)=(C_{i}\times K^{2})+(C_{i}\times K^{2}-1) (2×Ci×K2−1)=(Ci×K2)+(Ci×K2−1) ,第一项是乘法运算数,第二项是加法运算数,因为n个数相加,要加n-1次,所以不考虑bias,会有一个-1,如果考虑bias,刚好中和掉,括号内变为 2 × C i × K 2 2\times C_{i}\times K^{2} 2×Ci×K2
全联接层: ( 2 × I − 1 ) × O (2\times I-1)\times O (2×I−1)×O
I=input neuron numbers, O=output neuron numbers.
2是因为一个MAC算2个operations。
不考虑bias时有-1,有bias时没有-1。
e。
理解上面这个公式分两步,括号内是第一步,计算出output feature map的一个pixel,然后再乘以HWCo拓展到整个output feature map。括号内的部分又可以分为两步, ( 2 × C i × K 2 − 1 ) = ( C i × K 2 ) + ( C i × K 2 − 1 ) (2\times C_{i}\times K^{2}-1)=(C_{i}\times K^{2})+(C_{i}\times K^{2}-1) (2×Ci×K2−1)=(Ci×K2)+(Ci×K2−1) ,第一项是乘法运算数,第二项是加法运算数,因为n个数相加,要加n-1次,所以不考虑bias,会有一个-1,如果考虑bias,刚好中和掉,括号内变为 2 × C i × K 2 2\times C_{i}\times K^{2} 2×Ci×K2
全联接层: ( 2 × I − 1 ) × O (2\times I-1)\times O (2×I−1)×O
I=input neuron numbers, O=output neuron numbers.
2是因为一个MAC算2个operations。
不考虑bias时有-1,有bias时没有-1。
分析同理,括号内是一个输出神经元的计算量,拓展到O了输出神经元。