卷积层采用2-D Cross Correlation计算来代替卷积运算。
如下图所示,
计算过程为: 0 × 0 + 1 × 1 + 3 × 2 + 4 × 3 = 19 1 × 0 + 2 × 1 + 4 × 2 + 5 × 3 = 25 3 × 0 + 4 × 1 + 6 × 2 + 7 × 3 = 37 4 × 0 + 5 × 1 + 7 × 2 + 8 × 3 = 43 0\times0+1\times1+3\times2+4\times3=19\\ 1\times0+2\times1+4\times2+5\times3=25\\ 3\times0+4\times1+6\times2+7\times3=37\\ 4\times0+5\times1+7\times2+8\times3=43 0×0+1×1+3×2+4×3=191×0+2×1+4×2+5×3=253×0+4×1+6×2+7×3=374×0+5×1+7×2+8×3=43 之所以用2-D Cross Correlation计算是因为kernel中的数值都是通过学习得到的,所以即便不遵循卷积运算的计算方式,计算得到的结果也不会有问题。
上图中为一个具体的例子,抽象来看,设输入矩阵为 X X X,其大小为 n h × n w n_h\times n_w nh×nw;核矩阵为 W W W,其大小为 k h × k w k_h\times k_w kh×kw;输出矩阵为 Y Y Y,则 Y Y Y的大小为 ( n h − k h + 1 ) × ( n w − k w + 1 ) (n_h-k_h+1)\times(n_w-k_w+1) (nh−kh+1)×(nw−kw+1)。输出矩阵又称为特征图。
此时,三者之间的关系为 Y = X ⋆ W + b Y=X\star W+b Y=X⋆W+b 其中, b b b是偏置; W , b W,b W,b都是通过学习得到的参数。 W W W的大小也是通过学习得到的。
训练模型时,先对 W W W随机初始化,再开始训练。
不同卷积核对于输入的作用是不同的。
给定一张输入图像,并应用一个卷积层,输出图像尺寸会减小,且核越大,减小的越快;同时,作用卷积层的层数越多,得到的输出的尺寸也越小。
要想改变输出的尺寸,就要借助填充(padding)和步幅(stride)。
填充:在输入的周围填充行或列(一般填充0)
如果在输入周围填充了 p h p_h ph行和 p w p_w pw列,那么输出的形状为: ( n h − k h + p h + 1 ) × ( n w − k w + p w + 1 ) (n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1) (nh−kh+ph+1)×(nw−kw+pw+1)
因此,一般情况下,取 p h = k h − 1 , p w = k w − 1 p_h=k_h-1,\quad p_w=k_w-1 ph=kh−1,pw=kw−1,使得输入输出尺寸一样。如果 k h k_h kh是偶数,则在上下两侧各填充 p h / 2 p_h / 2 ph/2;如果 k h k_h kh是奇数,则在上侧填充 ⌈ p h / 2 ⌉ \lceil p_h/2\rceil ⌈ph/2⌉,下侧填充 ⌊ p h / 2 ⌋ \lfloor p_h / 2\rfloor ⌊ph/2⌋。左右两侧亦是如此处理。
步幅:每次滑动的行数/列数,默认为 1 1 1。
例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9em2Oxq-1593583270461)(5-2.png)]
计算过程如下: 0 × 0 + 0 × 1 + 0 × 2 + 0 × 3 = 0 0 × 0 + 0 × 1 + 1 × 2 + 2 × 3 = 8 0 × 0 + 6 × 1 + 0 × 2 + 0 × 3 = 6 7 × 0 + 8 × 1 + 0 × 2 + 0 × 3 = 8 0\times0+0\times1+0\times2+0\times3=0\\ 0\times0+0\times1+1\times2+2\times3=8\\ 0\times0+6\times1+0\times2+0\times3=6\\ 7\times0+8\times1+0\times2+0\times3=8\\ 0×0+0×1+0×2+0×3=00×0+0×1+1×2+2×3=80×0+6×1+0×2+0×3=67×0+8×1+0×2+0×3=8 如果在步幅大小为高 s h s_h sh,宽 s w s_w sw,那么输出的形状为: ⌊ ( n h − k h + p h + s h ) / s h ⌋ × ⌊ ( n w − k w + p w + s w ) / s w ⌋ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor\times\lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor ⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋
若 p h = k h − 1 , p w = k w − 1 p_h=k_h-1,\quad p_w=k_w-1 ph=kh−1,pw=kw−1,则输出的形状为: ⌊ ( n h + s h − 1 ) / s h ⌋ × ⌊ ( n w + s w − 1 ) / s w ⌋ \lfloor(n_h+s_h-1)/s_h\rfloor\times\lfloor(n_w+s_w-1)/s_w\rfloor ⌊(nh+sh−1)/sh⌋×⌊(nw+sw−1)/sw⌋
若输入的高和宽能分别被步幅的高和宽整除,则输出的形状为: ( n h / s h ) × ( n w / s w ) (n_h/s_h)\times(n_w/s_w) (nh/sh)×(nw/sw)
填充可以增大输出的尺寸,步幅可以减小输出的尺寸,因此将两者相结合,可以调整输出的尺寸,获得满意的结果。两者的宽高都是超参数,需要人为给定。
卷积层的特点:
相对全连接层而言,减少了模型复杂度和参数能高效地检测出空间模式计算复杂能通过填充、步幅、通道数来控制输出的尺寸图像处理的过程中,会遇到大量的彩色图片,有些彩色图片含有RGB三个通道,如果转成灰色模式,就会丢掉色彩信息。为了应对这种情况,使用Multiple Input Channel来处理。
给输入的每一个通道分配一个kernel,再将每个通道的输出相加,得到的输出就是最终结果。
此时 X : c i × n h × n w input W : c i × k h × k w kernel Y : m h × m w output X:c_i \times n_h\times n_w \qquad \text{input}\\ W:c_i\times k_h\times k_w \qquad \text{kernel}\\ Y:m_h\times m_w \qquad \text{output} X:ci×nh×nwinputW:ci×kh×kwkernelY:mh×mwoutput Y = ∑ i = 0 c i X i , : , : ⋆ W i , : , : Y=\sum_{i=0}^{c_i}X_{i,:,:}\star W_{i,:,:} Y=i=0∑ciXi,:,:⋆Wi,:,: 其中 c i c_i ci是输入通道数。
因此,无论输入通道数有几个,输出通道数一定为一。如果对于一个输入通道,想要得到多个输出通道,那就创建多个kernel。
此时 X : c i × n h × n w input W : c o × c i × k h × k w kernel Y : c o × m h × m w output X:c_i \times n_h\times n_w \qquad \text{input}\\ W:c_o\times c_i\times k_h\times k_w \qquad \text{kernel}\\ Y:c_o\times m_h\times m_w \qquad \text{output} X:ci×nh×nwinputW:co×ci×kh×kwkernelY:co×mh×mwoutput Y i , : , : = X ⋆ W i , : , : , i = i , 2 , ⋯ , c o Y_{i,:,:}=X\star W_{i,:,:},\quad i=i,2,\cdots, c_o Yi,:,:=X⋆Wi,:,:,i=i,2,⋯,co 其中 c o c_o co是输出通道数。
1 x 1 卷积层,即 k h = k w = 1 k_h=k_w=1 kh=kw=1。它相当于一个全连接层,输入大小为 n h n w × c i n_hn_w \times c_i nhnw×ci,权重为 c o × c i c_o \times c_i co×ci。一般用来调整网络层之间中的通道数,减少模型的参数量,控制网络复杂度。
目的:
减少数据维度缓解卷积层对于位置的敏感性 如图像的光照、比例、模糊卷积对于边缘敏感(边缘检测)常用池化方式:
最大化池化(Max Pooling):返回滑动窗口内的最大值。平均池化(Average Pooling):返回滑动窗口内的平均值。池化层也有填充、步幅和多通道等概念和操作。但是,对池化层而言,这些参数无需学习。
常用池化方式:
最大化池化(Max Pooling):返回滑动窗口内的最大值。平均池化(Average Pooling):返回滑动窗口内的平均值。池化层也有填充、步幅和多通道等概念和操作。但是,对池化层而言,这些参数无需学习。
经过池化操作后,得到的输出通道数和输入通道数相同。