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