Press "Enter" to skip to content

卷积神经网络——理论部分

如果没有填充,那幺每经过一次卷积操作,图像的大小都会变小,比如一个大小为 \(3 × 3\) 的过滤器在一个大小为 \(6 × 6\) 的图像上进行卷积,会得到一个大小为 \(4 × 4\) 的图像。事实上,假设原始图像大小为 \(n × n\),过滤器大小为 \(f × f\),那幺卷积后的图像大小为 \((n-f+1) × (n-f+1)\),很明显,这会导致图像的大小在几次卷积操作后就会越来越小。

 

没有填充的另一个缺点是,位于图像边缘的像素在卷积操作时只会被用到一次,而更接近图像中心的像素却会被用到多次,这使我们丢失了许多靠近图像边界的信息。

 

所以为了解决以上两个问题,一个方法是在进行卷积操作前对图像进行填充。同样用大小为 \(6×6\) 的图像为例,如果在该图像周围填充一圈像素点,那幺该图像的大小就会变为 \(8×8\),再用一个大小为 \(3×3\) 的过滤器对该图像进行卷积后,得到的图像的大小为 \(6×6\),这就使得卷积后的图像大小和原始图像(填充之前)的大小一样了。

 

我们用 p 来表示填充的像素圈数,此时卷积后的图像大小为 \((n+2p-f+1)×(n+2p-f+1)\),合理设置 p 的值,即可保证卷积后的图像大小不变,同时也提高了原始图像(填充前)边界信息的利用率。

 

如果希望卷积后图像大小不变,即 \(n+2p-f+1=n\),解得 \(p = \cfrac{f-1}{2}\) 即可。这里的 \(f\) 在绝大多数情况都是奇数而不是偶数,这样有两个好处:

 

 

    1. 如果 \(f\) 是偶数,将得到不对称的填充,因为这里的 p 无法除尽;

 

    1. \(f\) 为奇数可以保证过滤器有一个中心像素点,可以称之为中心像素,这样可以方便我们描述过滤器的位置。

 

 

当然用偶数的 \(f\) 也可以得到不错的结果,但一般情况下人们都会把 \(f\) 设置成奇数。

 

Stride(步幅)

 

没有引入 Stride(步幅)时,过滤器每次只移动一个像素点距离。引入 Stride 后用 s 表示步幅,此时过滤器每次移动 s 个像素点距离。比如一个大小为 \(3×3\) 的过滤器在一个大小为 \(7×7\) 的图像上进行步幅为 2 的卷积操作后,得到的图像大小为 \(3×3\)。

 

这里的关系式为,如果原始图像大小为 \(n×n\),过滤器大小为 \(f×f\),填充为 p,步幅为 s,那幺卷积后的图像大小为 \((\cfrac{n+2p-f}{s}+1) × (\cfrac{n+2p-f}{s}+1)\)。

 

一个问题是,如果式子中的分数除不尽怎幺办?办法是对 \((\cfrac{n+2p-f}{s}+1)\) 向下取整,因为如果过滤器移动到了其一部分超出图像边界的地方,那幺这里是不进行卷积运算的。

 

在三维图像上进行卷积运算

 

一副彩色图像有 RGB 三个通道,一个 \(6×6\) 大小的图像维度应该是 \(6×6×3\),这里的 3 便对应三个通道,对这样的图像进行卷积运算时,用到的过滤器的通道数必须与其一致,比如这里可以使用 一个 维度为 \(3×3×3\) 的过滤器,得到卷积后的图像维度为 \(4×4\)。如果使用 \(x\) 个该维度的过滤器,那幺卷积后的图像维度应为 \(4×4×x\)。

 

具体该如何运算呢?先以一个过滤器为例。

 

 

方便起见,这里不讨论 Padding 和 Stride。如上图所示,先将过滤器的三个通道分别于原图像左上角贴合,然后将这 27 个位置的元素对应相乘再相加,得到结果,填入输出图像的最左上角元素,然后移动过滤器继续运算,直到移动到原图像右下角为止。

 

如果有多个过滤器,比如两个,如图所示:

 

 

那幺按照刚才的计算方法,会得到两个维度为 \(4×4\) 的图像,再将这两幅二维图像叠在一起便得到了维度为 \(4×4×2\) 的图像。对于其他数量的过滤器,方法也是一样的。

 

(Pooling layer) 池化层

 

Max pooling (最大池化)

 

假设原始图像大小为 \(4×4\),过滤器大小为 \(2×2\),步幅为 2,不填充,那幺经过池化层后的图像大小为 \(2×2\),过滤器移动的方式和之前一样,只不过这里进行的运算不是卷积,而是取最大值,具体操作看这张图:

 

 

如上图所示,原始图像被分成了四个区域,这四个区域实际就是过滤器进行操作的四个区域,在每个区域里,取最大值赋给输出图像的相应位置。

 

如果考虑输入图像的通道数目,比如 \(n×n×n_c\),其中 \(n_c\) 代表通道数目,那幺输出图像的通道数目也是 \(n_c\),具体过程就是在输入图像的每个通道都进行池化操作。

 

Average pooling (平均池化)

 

顾名思义,与 Max Pooling 不同,Average pooling 在运算时取过滤器覆盖区域的平均像素值,再赋给输出图像的相应位置。

 

 

关于超参数的选择

f 和 s 都取 2 或者 f 取 3,s 取 2,这会使得输入图像的长宽近似变为一半
p 一般取 0,即不作任何填充
Max pooling 比 Average pooling 用得更多些

卷积神经网络的优势

 

Parameter sharing (参数共享)

 

如果一个过滤器是专门用来检测垂直边缘的,那幺对于输入图像的每一部分,该过滤器都能起作用,换句话说,该过滤器中的参数对于输入图像的每一部分都是有作用的,这使得一个用于检测某种特征(如垂直边界)的过滤器能够被用在输入图像的任何一个部分,这同时使得神经网络的参数大大减少,除了减少运算量,在一定程度上也能防止过拟合的发生。

 

Sparsity of connections (连接的稀疏性)

 

在每一层,每个输出值都只和输入图像中某一部分的输入值有关。这可以实现 translation invarience(平移无关性)。

 

关于平移无关性可以参考 这篇在 StackExchange 上的讨论

 

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注