卷积计算

卷积是数学分析中的一种积分变换的方法,在图像处理中采用的是卷积的离散形式。这里需要说明的是,在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation)运算,与数学分析中的卷积定义有所不同,这里跟其他框架和卷积神经网络的教程保持一致,都使用互相关运算作为卷积的定义,具体的计算过程如 所示。
在这里插入图片描述

互相关计算

虽然卷积层得名于卷积(convolution) 运算,但我们通常在卷积层中使用更加直观的互相关(cross-correlation) 运算。在二维卷积层中,一个二维输入数组和一个二维核(kernel)数组通过互相关运算输出一个二维数组。我们用一个具体的例子来解释二维互相关运算的含义。如上图所示。

卷积核(kernel)也被叫做滤波器(filter),假设卷积核的高和宽分别为 khk_hkhkwk_wkw,则将称为kh×kwk_h \times k_wkh×kw卷积,比如3×53 \times 53×5卷积,就是指卷积核的高为3,宽为5。


  • 如上图(a)所示:左边的图大小是3×33 \times 33×3,表示输入数据是一个维度为3×33\times33×3的二维数组;中间的图大小是2×22\times22×2,表示一个维度为2×22\times22×2的二维数组,我们将这个二维数组称为卷积核。先将卷积核的左上角与输入数据的左上角(即:输入数据的(0,0)位置)对齐,把卷积核的每个元素跟其位置对其的输入数据中的元素相乘,再把卷积相加,得到卷积输出的第一个结果:

                  0×1+1×2+2×4+3×5=250\times1 + 1\times2 + 2\times4 + 3\times5 = 250×1+1×2+2×4+3×5=25  (a)

图中( b ), ( c ) ,(d )计算方法与上面雷同,相信聪明的大家不需要我再过多演示。

卷积核的计算过程可以用下面的数学公式表示,其中aaa代表输入图片,bbb代表输出特征图,www是卷积核参数,它们都是二维数组。

                      b[i,j]=∑u,va[i+u,j+v]⋅w[u,v]b[i,j] =\displaystyle \sum_{u,v}a[i + u, j+v]\cdot w[u,v]b[i,j]=u,va[i+u,j+v]w[u,v]

举例说明,加入上图中卷积核大小是2×22\times22×2,则uuu可以取0和1,vvv也可以取0和1,也就是说:

  b[i,j]=a[i+0,j+0]⋅w[0,0]+a[i+0,j+1]⋅w[0,1]+a[i+1,j+0]⋅w[1,0]+a[i+1,j+1]⋅w[1,1]b[i,j] = a[i+0,j+0]\cdot w[0,0] + a[i+0,j+1]\cdot w[0,1] + a[i+1,j+0]\cdot w[1,0] +a[i+1,j+1]\cdot w[1,1]b[i,j]=a[i+0,j+0]w[0,0]+a[i+0,j+1]w[0,1]+a[i+1,j+0]w[1,0]+a[i+1,j+1]w[1,1]

我们可以验证一下它的正确性,当[i,j][i,j][i,j]取不同值的时候,根据此公式计算的结果与上图的例子是否一致。

补充:
在卷积神经网络中,一个卷积算子除了上面描述的卷积过程之外,还包括加上偏置项的操作。例如假设偏置为1,则上面卷积计算的结果为:
0×1+1×2+2×4+3×5+1=260\times1+1\times2+2\times4+3\times5 +1=260×1+1×2+2×4+3×5+1=26

0×2+1×3+2×5+3×6+1=320\times2+1\times3+2\times5+3\times6 +1=320×2+1×3+2×5+3×6+1=32

0×4+1×5+2×7+3×8+1=440\times4+1\times5+2\times7+3\times8 +1=440×4+1×5+2×7+3×8+1=44

0×5+1×6+2×8+3×9+1=500\times5+1\times6+2\times8+3\times9 +1=500×5+1×6+2×8+3×9+1=50

练习

学完知识后,我们来做一道题进行下练习,帮助我们充分掌握卷积的运算。
题目:计算卷积中一共有多少次乘法和加法操作
输入数据形状是[10,3,224,224][10,3,224,224][10,3,224,224],卷积核kh=kw=3k_h = k_w = 3kh=kw=3,输出通道数为64,步幅stride=1stride=1stride=1,填充ph=pw=1p_h=p_w=1ph=pw=1
则完成这样一个卷积,一共需要做多少次乘法和加法操作?

  • 提示
    先看输出一个像素点需要做多少次乘法和加法操作,然后再计算总共需要的操作次数。

做题步骤:

  1. 先考虑只有一个输入通道时候的二维卷积:
    假设输出是B,输入是A,先计算B的一个像素点,
    在这里插入图片描述
    其中,一共有9个乘法,8个加法操作。
    但是一般我们输入的图片都是RGB三通道的,所以我们需要计算每个通道B00(c=0),B00(c=1),B00(c=2)B^{(c=0)}_{00},B^{(c=1)}_{00},B^{(c=2)}_{00}B00(c=0),B00(c=1),B00(c=2),总共的乘法操作次数为3×9=273\times9=273×9=27,加法操作次数为3×8=243\times8=243×8=24次。

  2. 然后再将这些输入通道的数值相加,并且加上偏置参数 bbb
    B00=B00(c=0)+B00(c=1)+B00(c=2)+bB_{00}=B^{(c=0)}_{00}+B^{(c=1)}_{00}+B^{(c=2)}_{00}+bB00=B00(c=0)+B00(c=1)+B00(c=2)+b
    由于需要额外引入3次加法操作,所以最后总的加法操作次数是24+3=2724+3=2724+3=27
    由此可得计算出一个像素点需要乘法操作次数是27,加法操作次数也是27。

  3. 输出特征图的大小是[10,64,224,224][10,64,224,224][10,64,224,224],则总共需要乘法操作次数是:
    27×10×64×224×224=86704128027\times10\times64\times224\times224=86704128027×10×64×224×224=867041280
    加法操作次数和乘法操作次数相同都是867041280。

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐