1. 求特征图大小及感受野
参考博客:关于感受野的理解与计算
某一个网络有三个操作,输入大小为200×200,第一层为卷积层,卷积核的大小为5×5,stride为2,padding为1;第二层为池化层,池化大小为3×3,stride为1;第三层为卷积层,卷积核大小为3×3,padding为1,stride为1.求每一层特征图的大小及感受野。
感受野的计算示意图:
具体公式如下,第n层感受野大小=上一层感受野大小+(第n层卷积核大小-1)乘以本层以前所有stride的乘积
2. 求卷积计算量
分别计算以下两个操作所需要的乘累加操作次数
1、输入3×20×20图片,经过一个kernelsize = 3×3,stride=2的convolution层,输出一个5×10×10的特征图
2、输入3×20×20图片,经过一个kernelsize = 3×3,stride=2 的depthwise convolution层,输出一个5×10×10的特征图
要计算这两个题,首先要搞懂的就是什么是乘累加操作.
卷积的操作的本质就是乘累加操作,即卷积核上元素与图像对应的位置的元素相乘然后累加。以下图为例,计算生成图中4时的乘累加次数等于3×3,这里3代表这卷积核的大小,即为了生成新的元素4,做了9次操作运算。
那么为了下面红色的整个新的特征图呢?操作次数就为3×3×3×3 = 27,其中第一个3×3就是上述生成一新个元素所需要的操作数,那么后面的3×3自然表示了要生成的新元素个数,也就是新的特征图的大小。
因此我们可以得到,卷积的乘累加操作数量 = 卷积核的维度 * 输出特征图的维度 ---------------------------------->公式1
对于单张特征图,假定卷积核的大小为Df,输出特征图的大小为Dk,则卷积的乘累加操作数量 = Df × Df ×Dk × Dk。
那么实际上就如题中所述,大多数卷积操作输入输出都不可能只是一张特征图的,那么这时候该如何计算呢?请看下图。
该图表达了一个标准的卷积操作。Dk为卷积核的大小,M为卷积核的深度(也代表着输入特征图channel数),因此该卷积操作卷积核实际可以表示为Dk×Dk×M,然后共用N个这样的卷积核,就可以新的生成N个特征图,则生成特征图可以表示为Df×Df×N。(这里Df为输出特征图的大小)。
我们仍然套用公式1,不过此时卷积核的维度不在是二维的,而是三维的,是Dk × Dk × M,输出特征图的维度也是三维的,是Df×Df×N,因此操作的次数为:Dk × Dk× M × Df × Df × N.
可以看出就是在单张特征图的情况下后面多了一项 × M × N。其实前面的简单情况下相当于M=N=1,即输入特征图的channel = 输出特征图的channel =1 。
因此第一问的答案就是:10×10×3×3×3×5 = 13500。
第二问就涉及到了轻量化网络mobilenet的相关知识了。mobilenet之所以能够轻量化就是采用了depthwise separable convolution的卷积方式。depthwise separable convolution的方式可以分为两个步骤,第一个就是depthwise convolution,第二步就是pointwise convolution。
什么是depthwise convolution呢?depthwise convolution是针对每个输入通道采用不同的卷积核,就是说一个卷积核对应一个输入通道,所以说depthwise convolution是depth级别的操作。
还是以上的例子来说,假设输入特征图为Df × Df × M,此时我们输入的每一个特征图,都采用一种卷积核进行操作,卷积核大小为Dk × Dk,卷积后的特征图为Df × Df × M。我们仍可以套用上面红色的公式,只不过此时相当于M等于1了,因为一个卷积核只对一个特征图操作,即厚度为1。然后N就等于下图中的M了,此时的操作数就为:Df × Df × Dk × Dk × M。
什么是pointwise convolution呢?pointwise convolution其实就是普通的卷积,只不过其采用1x1的卷积核。
经过上述depthwise convolution后,特征图的大小为Df × Df × M。但是我们最终生成的是 Df × Df × N。此时可以用普通卷积的方法,用N个大小为1×1×M的卷积核即可。则此时的计算量为:Df × Df × 1 × 1 × M × N = Df × Df × M × N
因此最采用 depthwise separable convolution方式的操作数为:
Df × Df × Dk × Dk × M + Df × Df × M × N
因此第二问的结果为:10×10×3×3×3 + 10×10 ×3× 5 = 4200