Pytorch深度学习-理论篇:卷积神经网络

介绍神经网络中卷积层的概念,包括卷积的填充、步长和池化操作。同时对比卷积和全连接层的区别。

卷积

二维图像卷积

卷积是个错误叫法,实际运算其实是互相关运算。
在⼆维互相关运算中,卷积窗口从输⼊张量的左上角开始,从左到右、从上到下滑动。当卷积窗口滑动到新⼀个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到⼀个单⼀的标量值,由此我们得出了这⼀位置的输出张量值。如:

即:

$0 \times 0 + 1 \times 1 + 3 \times 2 + 4 \times 3 = 19$
$1 \times 0 + 2 \times 1 + 4 \times 2 + 5 \times 3 = 25$
$3 \times 0 + 4 \times 1 + 6 \times 2 + 7 \times 3 = 37$
$4 \times 0 + 5 \times 1 + 7 \times 2 + 8 \times 3 = 43$

卷积作用

卷积可以实现许多内容,比如Sobel算子可以提取图像边缘特征,还有一些平均滤波器可以对图像进行高斯模糊。这里不做具体概述,详情可查询数字图像处理相关知识。

填充

如上图所示,如果对原图像张量进行卷积,最终结果会小于原张量的原尺寸,体现在图像上就是会丢失图像边框部分的像素。因此,在对图像卷积前,我们可以在输⼊图像的边界填充元素(通常填充元素是0)。如图:

假设图像有$n_h$行$n_w$列,卷积核有$k_h$行$k_w$列,添加$p_h$行$p_w$列,则输出形状为:

$(n_h-k_h+p_h+1) \times (n_w-k_w+p_w+1)$

卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。

步长

在前面的例子中,我们默认每次滑动⼀个元素。但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。
我们将每次滑动元素的数量称为步幅(stride)。下图就是垂直步幅为3,⽔平步幅为2的⼆维互相关运算。着色部分是输出元素以及⽤于输出计算的输⼊和内核张量元素。

当垂直步幅为$s_h$、⽔平步幅为$s_w$时,输出形状为:

$[(n_h-k_h+p_h+1)/s_h] \times [(n_w-k_w+p_w+1)/s_w]$

三维图像卷积

当输入包含多个通道时,需要构造一个与输⼊数据具有相同输入通道数的卷积核,以便与输⼊数据进行互相关运算。
输入输⼊有$c_i$个通道,那么卷积核也应有$c_i$个通道。然后以对每个通道输⼊的二维张量和卷积核的二维张量进⾏互相关运算,再对通道求和(将$c_i$的结果相加)得到二维张量。

卷积神经网络

卷积层

如图就是一个独立的卷积层,其包含两个神经元(有两个不同的核函数)。注意,卷积层输出的通道数仅取决于神经元个数。
不同的神经元可以代表不同的处理,比如第一个神经元的核函数可以代表图像水平边缘,第二个神经元的核函数可以代表图像垂直边缘,通过这两个特性来实现图像的边缘特征提取。

池化层(汇聚层)

与卷积层类似,池化层运算符由⼀个固定形状的窗⼝组成,该窗口根据其步幅大小在输⼊的所有区域上滑动,为固定形状窗⼝遍历的每个位置计算一个输出。然而,不同于卷积层中的输入与卷积核之间的互相关计算,汇聚层不包含参数。相反,池运算是确定性的,我们通常计算汇聚窗口中所有元素的最大值或平均值。这些操作分别称为最大池化层(maximum pooling)和平均池化层(average pooling)。

对于池化层的机制,以最大池化层为例,某种解释是它提取了图像局部特征中最主要的特征(最大值),所以可以提升神经网络的效果。
但实际上池化层为何有效并没有十分确切的答案,只能说是基于经验来看它确实有效。

卷积神经网络(Lenet)

Lenet是最早发布的卷积神经网络之一,目的是识别图像中的手写数字。
总体来看,LeNet由两个部分组成:

  • 卷积编码器:由两个卷积层组成,负责学习图片空间特征
  • 全连接层密集块:由三个全连接层组成,负责将图片转换为类别空间

每个卷积块中的基本单元是⼀个卷积层、⼀个sigmoid激活函数和平均汇聚层。每个卷积层使⽤$5 \times 5$卷积核和一个sigmoid激活函数。这些层将输⼊映射到多个二维特征输出,通常同时增加通道的数量。第⼀卷积层有6个输出通道,⽽第⼆个卷积层有16个输出通道。每个$2 \times 2$池操作(步幅2)通过空间下采样将维数减少4倍。卷积的输出形状由批量⼤小、通道数、高度、宽度决定。
为了将卷积块的输出传递给稠密块,我们必须在小批量中展平每个样本。换言之,我们将这个四维输⼊转换成全连接层所期望的二维输⼊。这⾥的二维表⽰的第一个维度索引小批量中的样本,第二个维度给出每个样本的平面向量表⽰。LeNet的稠密块有三个全连接层,分别有120、84和10个输出。因为我们在执行分类任务,所以输出层的10维对应于最后输出结果的数量。

卷积层相比全连接层的优势

参数优势

在输入是一个图像的情况下,如果采用全连接层,那么图像中每一个像素都将需要一个权重参数$w$与其对应,在如今像素值往往能达到千万甚至亿万数量级的情况下,仅仅构建一个单层全连接神经网络也将需要大量的参数开销,这显然很不科学。
而卷积层仅需要的参数仅仅是卷积核内的参数,相比全连接层要少很多,这使得我们可以轻而易举的只占用很少量的内存空间就能构建深层神经网络。

特性优势

同时,卷积操作也满足了平移不变性和局部性两个特点:

  • 平移不变性:不论卷积核移动到图像哪一个位置,其参数永远只与卷积核本身相关,与图像位置无关。
  • 局部性:卷积操作只关注图像中某一部分的局部特征。

这些是全连接层所不具备的特点,且这两个特点在图像处理中十分有用。比如,我们希望识别处场景中的猫,那么不论猫在哪里神经网络都应该正确判断,而这个猫肯定只占图像中的一小部分,而不是填充满整个画幅。

---------------------本文结束---------------------