卷积神经网络
卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今几乎所有的图像识别、目标检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。
现代卷积神经网络的设计得益于生物学、群论和一系列的补充实验。 卷积神经网络需要的参数少于全连接架构的网络,而且卷积也很容易用GPU并行计算。 因此卷积神经网络除了能够高效地采样从而获得精确的模型,还能够高效地计算。 久而久之,从业人员越来越多地使用卷积神经网络。即使在通常使用循环神经网络的一维序列结构任务上(例如音频、文本和时间序列分析),卷积神经网络也越来越受欢迎。 通过对卷积神经网络一些巧妙的调整,也使它们在图结构数据和推荐系统中发挥作用。
动手学深度学习:https://zh-v2.d2l.ai/chapter_convolutional-neural-networks/index.html
从全连接到卷积
以猫狗区分为例:假设我们有一个足够充分的照片数据集,数据集中是拥有标注的照片,每张照片具有百万级像素,这意味着网络的每次输入都有一百万个维度。 即使将隐藏层维度降低到1000,这个全连接层也将有$10^6×10^3=10^9$个参数。 想要训练这个模型将不可实现,因为需要有大量的GPU、分布式优化训练的经验和超乎常人的耐心。
此外,拟合如此多的参数还需要收集大量的数据。然而,如今人类和机器都能很好地区分猫和狗:这是因为图像中本就拥有丰富的结构,而这些结构可以被人类和机器学习模型使用。 卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法。
卷积神经网络主要包括卷积层、池化层、全连接层
- 卷积层:用于对图像进行特征提取操作,其卷积核权重是共享权值的,对应的相关概念还包括步长,填充。
- 池化层:用于降低特征图大小,降低后续操作的计算量和参数量
- 全连接层:最终进行分类输出使用,本质就是多层感知机
图像卷积
严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算(cross-correlation),而不是卷积运算。为了与深度学习文献中的标准术语保持一致,我们将继续把“互相关运算”称为卷积运算,尽管严格地说,它们略有不同。
填充
假设以下情景: 有时,在应用了连续的卷积之后,我们最终得到的输出远小于输入大小。这是由于卷积核的宽度和高度通常大于1所导致的。比如,一个240×240像素的图像,经过10层5×5的卷积后,将减少到200×200像素。如此一来,原始图像的边界丢失了许多有用信息。
填充的目的:
1.使卷积后图像分辨率不变,方便计算特征值图尺寸的变化
2.弥补边界信息“丢失”
填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。下图我们在原输入高和宽的两侧分别添加了值为0的元素,使得输入高和宽从3变成了5,并导致输出高和宽由2增加到4。下图阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+0×1+0×2+0×3=0。
步长
在计算互相关时,卷积窗口从输入张量的左上角开始,向下、向右滑动。 在前面的例子中,我们默认每次滑动一个元素。 但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。
卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅或步长(stride)
下图展示了在高上步幅为3、在宽上步幅为2的卷积运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了3行,而在输出第一行第二个元素时卷积窗口向右滑动了2列。当卷积窗口在输入上再向右滑动2列时,由于输入元素无法填满窗口,无结果输出。下图阴影部分为输出元素及其计算所使用的输入和核数组元素:0×0+0×1+1×2+2×3=8、0×0+6×1+0×2+0×3=6。
多输入输出通道
例如彩色图像具有标准的RGB通道来代表红、绿和蓝。 但是到目前为止,我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二维张量。
当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3×h×w的形状。我们将这个大小为3的轴称为通道(channel)维度。本节将更深入地研究具有多输入和多输出通道的卷积核。
多输入通道
当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。
假设输入的通道数为$c_i$,那么卷积核的输入通道数也需要为$c_i$。如果卷积核的窗口形状是$k_h×k_w$,那么当$c_i=1$时,我们可以把卷积核看作形状为$k_h×k_w$的二维张量。
然而,当$c_i>1$时,我们卷积核的每个输入通道将包含形状为$k_h×k_w$的张量。将这些张量$c_i$连结在一起可以得到形状为$c_i×k_h×k_w$的卷积核。由于输入和卷积核都有$c_i$个通道,我们可以对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和(将$c_i$的结果相加)得到二维张量。这是多通道输入和多输入通道卷积核之间进行二维互相关运算的结果。
(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56。
多输出通道
到目前为止,不论有多少输入通道,我们还只有一个输出通道。然而正如我们在前面所述,每一层有多个输出通道是至关重要的。在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作对不同特征的响应。而现实可能更为复杂一些,因为每个通道不是独立学习的,而是为了共同使用而优化的。因此,多输出通道并不仅是学习多个单通道的检测器。
用$c_i$和$c_o$分别表示输入和输出通道的数目,并让$k_h$和$k_w$为卷积核的高度和宽度。为了获得多个通道的输出,我们可以为每个输出通道创建一个形状为$c_i×k_h×k_w$的卷积核张量,这样卷积核的形状是$c_o×c_i×k_h×k_w$。在互相关运算中,每个输出通道先获取所有输入通道,再以对应该输出通道的卷积核计算出结果。
池化
对图像进行下采样,降低图像分辨率。
池化层的作用:使特征图变小,简化网络计算复杂度;压缩特征,提取主要特征
常见的池化操作可以分为:最大池化(Max Pool)、平均池化(Avg Pool),示意图如下:
卷积和池化输出尺寸计算
假设输入图片的高和宽一致,卷积核的宽和高一致,那么输入图像的尺寸与输出图像的尺寸有如下关系:
其中,Fin 是输入图像、k 是卷积核的大小、p 是图像填充的大小、s 是卷积核的步幅、Fo 是输出、⌊6.6⌋ 是向下取整的意思,比如结果是 6.6,那么向下取整就是 6
$$
F_o = \left\lfloor \frac{F_{in} - k + 2p}{s} \right\rfloor + 1
$$
参数个数计算
卷积层params = Co×(Ci×Kw×Kh +1)
其中,Co代表输入的通道数,Ci代表输出的通道数,Kw×Kh为卷积核的大小,若卷积核有偏置项(Bias)则+1,没有则不加。
池化层可以不用算参数量
全连接层=params = ( I + 1 ) × O
其中,I 为输入向量的维度也可以称作输入特征图的大小,O为输出向量的维度
计算量FLOPs
卷积层
计算公式如下:
FLOPs = [Ci×Kw×Kh+(Ci×Kw×Kh-1) +1]×W×H×Co =
其中Ci×Kw×Kh为一次卷积的乘法预算的计算量,(Ci×Kw×Kh-1)为一次卷积加法运算的计算量,+1为偏置项,W与H为特征图(feture map)的长和宽。
简化为:2×Ci×Kw×Kh×W×H×Co
池化层
计算公式如下:
FLOPs = H × W × Ci
其中H,W为特征图的(feture map)的高和宽,Ci为输入的通道数。
全连接层
计算公式如下:
FLOPs = [I + (I-1) + 1] × O = 2 × I × O
其中I为一次乘法,I-1为一次加法,+1为加上一个偏置项
易混淆概念区分
FLOPS(Floating Point Operations per Second)
FLOPS 表示单位时间内的浮点运算次数,是衡量计算机系统或计算设备处理能力的一种指标。而浮点运算次数指的是乘法、除法、加法、减法等的次数。
FLOPs(Floating Point Operations)
FLOPs 指的是模型中的浮点运算操作总数,也常称为计算量。主要用于衡量模型的计算复杂度。通常是衡量模型在一次前向传播过程中需要执行多少次浮点运算的总量。