深度神经网络

卷积、填充和步幅

卷积层采用2-D Cross Correlation计算来代替卷积运算。

如下图所示,人工智能导论复习整理(四)

计算过程为:
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 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
之所以用2-D Cross Correlation计算是因为kernel中的数值都是通过学习得到的,所以即便不遵循卷积运算的计算方式,计算得到的结果也不会有问题。

上图中为一个具体的例子,抽象来看,设输入矩阵为XX,其大小为nh×nwn_h\times n_w;核矩阵为WW,其大小为kh×kwk_h\times k_w;输出矩阵为YY,则YY的大小为(nhkh+1)×(nwkw+1)(n_h-k_h+1)\times(n_w-k_w+1)。输出矩阵又称为特征图

此时,三者之间的关系为
Y=XW+b Y=X\star W+b
其中,bb是偏置;W,bW,b都是通过学习得到的参数。WW的大小也是通过学习得到的。

训练模型时,先对WW随机初始化,再开始训练。

不同卷积核对于输入的作用是不同的。

给定一张输入图像,并应用一个卷积层,输出图像尺寸会减小,且核越大,减小的越快;同时,作用卷积层的层数越多,得到的输出的尺寸也越小。

要想改变输出的尺寸,就要借助填充(padding)和步幅(stride)。

填充:在输入的周围填充行或列(一般填充0)

如果在输入周围填充了php_h行和pwp_w列,那么输出的形状为:(nhkh+ph+1)×(nwkw+pw+1)(n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1)

因此,一般情况下,取ph=kh1,pw=kw1p_h=k_h-1,\quad p_w=k_w-1,使得输入输出尺寸一样。如果khk_h是偶数,则在上下两侧各填充ph/2p_h / 2;如果khk_h是奇数,则在上侧填充ph/2\lceil p_h/2\rceil,下侧填充ph/2\lfloor p_h / 2\rfloor。左右两侧亦是如此处理。

步幅:每次滑动的行数/列数,默认为11

例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9em2Oxq-1593583270461)(5-2.png)]

计算过程如下:
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 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\\
如果在步幅大小为高shs_h,宽sws_w,那么输出的形状为:(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw\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

ph=kh1,pw=kw1p_h=k_h-1,\quad p_w=k_w-1,则输出的形状为:(nh+sh1)/sh×(nw+sw1)/sw\lfloor(n_h+s_h-1)/s_h\rfloor\times\lfloor(n_w+s_w-1)/s_w\rfloor

若输入的高和宽能分别被步幅的高和宽整除,则输出的形状为:(nh/sh)×(nw/sw)(n_h/s_h)\times(n_w/s_w)

填充可以增大输出的尺寸,步幅可以减小输出的尺寸,因此将两者相结合,可以调整输出的尺寸,获得满意的结果。两者的宽高都是超参数,需要人为给定。

卷积层的特点:

  1. 相对全连接层而言,减少了模型复杂度和参数
  2. 能高效地检测出空间模式
  3. 计算复杂
  4. 能通过填充、步幅、通道数来控制输出的尺寸

多通道

图像处理的过程中,会遇到大量的彩色图片,有些彩色图片含有RGB三个通道,如果转成灰色模式,就会丢掉色彩信息。为了应对这种情况,使用Multiple Input Channel来处理。

给输入的每一个通道分配一个kernel,再将每个通道的输出相加,得到的输出就是最终结果。

此时
X:ci×nh×nwinputW:ci×kh×kwkernelY:mh×mwoutput 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}
Y=i=0ciXi,:,:Wi,:,: Y=\sum_{i=0}^{c_i}X_{i,:,:}\star W_{i,:,:}
其中cic_i是输入通道数。

因此,无论输入通道数有几个,输出通道数一定为一。如果对于一个输入通道,想要得到多个输出通道,那就创建多个kernel。

此时
X:ci×nh×nwinputW:co×ci×kh×kwkernelY:co×mh×mwoutput 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}
Yi,:,:=XWi,:,:,i=i,2,,co Y_{i,:,:}=X\star W_{i,:,:},\quad i=i,2,\cdots, c_o
其中coc_o是输出通道数。

1 x 1 卷积层,即kh=kw=1k_h=k_w=1。它相当于一个全连接层,输入大小为nhnw×cin_hn_w \times c_i,权重为co×cic_o \times c_i。一般用来调整网络层之间中的通道数,减少模型的参数量,控制网络复杂度。

池化

目的:

  1. 减少数据维度
  2. 缓解卷积层对于位置的敏感性
    1. 如图像的光照、比例、模糊
    2. 卷积对于边缘敏感(边缘检测)

常用池化方式:

  1. 最大化池化(Max Pooling):返回滑动窗口内的最大值。
  2. 平均池化(Average Pooling):返回滑动窗口内的平均值。

池化层也有填充、步幅和多通道等概念和操作。但是,对池化层而言,这些参数无需学习。

常用池化方式:

  1. 最大化池化(Max Pooling):返回滑动窗口内的最大值。
  2. 平均池化(Average Pooling):返回滑动窗口内的平均值。

池化层也有填充、步幅和多通道等概念和操作。但是,对池化层而言,这些参数无需学习。

经过池化操作后,得到的输出通道数和输入通道数相同。

相关文章: