携手创作,共同生长!这是我参与「日新计划 8 月更文应战」的第14天,点击检查活动概况

卷积神经网络

卷积

卷积的进程能够看作两个矩阵之间特殊的乘法,如下图所示:

卷积神经网络-基础知识

一个是输入张量,另一个是卷积核,卷积核通常为较小尺度的矩阵,比如3X3,5X5等,卷积核会从输入张量的左上角开端,从左到右,从上到下进行滑动,输入张量部分矩阵与卷积核进行按元素相乘并相加得到一个值。

依据上图所示,输出张量的各个元素核算进程如下:

00+11+32+43=19,10+21+42+53=25,30+41+62+73=37,40+51+72+83=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.

如下动图演示整个进程:

卷积神经网络-基础知识

引荐一个网站:pwwang.github.io/cnn-convolu…

上图的卷积核算进程其实是互相关(Cross-Correlation)运算。

数学中,两个函数的卷积被界说为:

(f∗g)(x)=∫f(z)g(x−z)dz.(f * g)(\mathbf{x}) = \int f(\mathbf{z}) g(\mathbf{x}-\mathbf{z}) d\mathbf{z}.

能够解释成函数 f 与 g 经过翻转和平移时,核算两个函数之间的重叠面积。当是离散对象时,积分就变成求和运算,公式如下:

(f∗g)(i)=∑af(a)g(i−a).(f * g)(i) = \sum_a f(a) g(i-a).

该公式运用到二维张量中,对应的便是:

(f∗g)(i,j)=∑a∑bf(a,b)g(i−a,j−b).(f * g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b).

依据这个公式,核算进程如下:

卷积神经网络-基础知识

和之前讲的不太相同,如同不是一一对应的元素相乘,再相加。因为减号的存在,所以核算进程相当于将核矩阵旋转了180度,再与输入矩阵相乘求和了。

其实在卷积神经网络的运用场景下,更多的是对待图画,图画是否旋转,旋转多少,关于核算机是无差异的,核算机核算的是图画的像素点,不旋转的互相关运算核算起来更便利。因此,许多深度学习结构直接运用互相关运算来表明卷积的进程。

卷积中的卷,指的是函数翻转与滑动,你能够了解成卷毛巾进程,从 g(z) 变成 g(i-z) 的这个进程。

卷积中的积,指的是积分或者求和。

到这里期望你了解了卷积的意义以及在神经网络的意义。

引荐了解文章:

  • www.zhihu.com/question/22…
  • lulaoshi.info/machine-lea…
  • baike.baidu.com/item/%E5%8D…

Padding与Stride

假定输入形状为nhnwn_h\times n_w,卷积核形状为khkwk_h\times k_w,那么输出形状将是(nh−kh+1)(nw−kw+1)(n_h-k_h+1) \times (n_w-k_w+1)。因此,卷积的输出形状取决于输入形状和卷积核的形状。

填充

在上述图片的核算进程,其实咱们丢掉了边际信息,如果期望在输出张量中存在边际信息,就能够在输入张量进行填充元素,默许是 0 ,这便是 Padding。如下图所示:

卷积神经网络-基础知识

假定对输入张量进行php_h行填充,pwp_w列填充,那么输出的形状将为(nh−kh+ph+1)(nw−kw+pw+1)。(n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1)。

在许多情况下,咱们期望输入张量与输出张量形状是共同的,那么就需求设置ph=kh−1p_h=k_h-1pw=kw−1p_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行。

在代码中都是 p/2

卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。

步幅

卷积核会从输入张量的左上方开端,按从左往右、从上往下的次序,依次在输入矩阵上滑动,那么滑动的行数和列数称为步幅(Stride)。

在之前的比如中都是默许步幅是 1 。如下图所示,运用了纵向步幅为3、横向步幅为2 的核算进程。

卷积神经网络-基础知识

通常,当垂直步幅为shs_h、水平步幅为sws_w时,输出形状为⌊(nh−kh+ph+sh)/sh⌋⌊(nw−kw+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.

通道

一张彩色的图画,是一个3hw3\times h\times w 的高维数组hhww是图画的高度与宽度,单位是像素,3则是图画的通道,因为RGB(红、绿、蓝)3个颜色通道。

当你的输入张量具有多个通道时,构造的卷积核的通道数需求与输入张量的通道数相同,不同的通道的卷积核与不同通道的输入张量进行核算。

举个比如:

假定输入张量的通道数为cic_{i},那么卷积核的输入通道数也需求为cic_i。咱们卷积核的形状为khkwk_h\times k_w的张量。将这些cic_i个张量连结在一起能够得到形状为cikhkwc_i\times k_h\times k_w的卷积核。因为输入和卷积核都有cic_i个通道,咱们能够对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和(将cic_i的成果相加)得到二维张量。

多输入通道与卷积核进行运算会得到单通道的二维张量。

卷积神经网络-基础知识

当输出通道为多个,卷积核需求再添加一维,多个通道的卷积核进行相加得到输出张量。

举个比如:

假定输入和输出通道的数目分别表明cic_icoc_o,卷积核的高度和宽度为khk_hkwk_w,当coc_o大于 1 时,每个输出通道都会有一个形状为cikhkwc_i\times k_h\times k_w的卷积核张量,那么整个卷积核形状是cocikhkwc_o\times c_i\times k_h\times k_w。每个输出通道的输出张量是每个通道的卷积核相加得到成果。

卷积神经网络-基础知识

主张多了解一下这里!

当多输入通道,卷积核也会有着相同的通道,通道对应的进行互相关核算,最终成果相加得到一个二维张量,当多输出通道,在多输入通道的基础上,添加卷积核的维度,就能够得到多个输出通道成果。

池化层

与卷积层类似,由一个固定窗口构成,叫做pooling。该窗口会依据步幅在输入张量上进行滑动,依据特殊核算得到一个输出,值得注意的是该窗口是没有参数构成,便是设置一个固定形状的窗口。通常核算窗口中所有元素的最大值或均匀值,分别称为最大池化层(maximum pooling)和均匀池化层(average pooling)。

假定设置一个最大池化层,它的形状为 2X2。窗口就会从输入张量的左上角开端,从左往右、从上往下的在输入张量内滑动,核算覆盖输入张量的子张量的最大值,得出输出成果。

卷积神经网络-基础知识

核算进程如下:

max⁡(0,1,3,4)=4,max⁡(1,2,4,5)=5,max⁡(3,4,6,7)=7,max⁡(4,5,7,8)=8.\max(0, 1, 3, 4)=4,\\ \max(1, 2, 4, 5)=5,\\ \max(3, 4, 6, 7)=7,\\ \max(4, 5, 7, 8)=8.\\

池化层也有步幅与填充,该进程与卷积层是相同的,就不多介绍了。

当涉及的多个通道输入数据时分,池化层会在每个通道进行单独运算,不会对成果进行汇总,相当于处理每一个通道的数据, 所以池化层的输出通道数与输入通道数相同。池化层是没有多个输出通道问题。

为什么会需求池化层?

实际学习进程,咱们想要辨认图画中某一个物体时分,它在数据会集是不会出现在固定方位,不同图画物体的像素方位也是不同的,咱们需求愈加关心的是物体的概括是否满足咱们想要辨认的物体,不期望模型对物体像素方位有必定要求的。池化层能够缓解卷积层对方位的过度敏感性,一起降低对空间降采样表明的敏感性。

参阅:

  • lulaoshi.info/machine-lea…
  • www.cnblogs.com/shine-lee/p…
  • zhuanlan.zhihu.com/p/268179286
  • 动手学深度学习-李沐