深度学习笔记3-卷积神经网络CNN
3.1 图像数据与边缘检测
3.1.1 图像数据
在CV领域,通常要做的是用机器程序代替人眼对目标图像进行识别、分析、处理。
深度学习在CV领域的应用非常广泛。
假设需要处理1024x1024的彩色图像,每个像素有RGB三个通道,共有1024x1024x3=3,145,728个特征。
假设第一个隐藏层有10个神经元,那么第一层的权重矩阵有3,145,728x10=31,457,280个参数,计算量极大,难以达到好的效果。
相比多层神经网络,卷积神经网络(CNN)更适合处理图像数据。
3.1.2 感受野(Receptive Field)
1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野的概念。
Fukushima基于感受野概念提出的神经认知机(Neocognitron)可以看作是卷积神经网络的第一个实现网络。
单个感受器与许多感觉神经纤维相联系,感觉信息是通过许多感受神经纤维发放总和性的空间与时间类型不同的冲动,相当于经过编码来传递。
3.1.3 边缘运算
为了使用更少的参数检测出更多的信息,通常神经网络需要检测出物体最明显的垂直和水平边缘来区分物体。
随着深度学习的发展,我们需要检测更复杂的图像中的边缘。
与其使用由人手工设计的过滤器,还可以将过滤器中的数值作为参数,通过反向传播来学习得到。
算法可以根据实际数据来选择合适的检测目标,无论是检测水平边缘、垂直边缘还是其他角度的边缘,并习得图像的低层特征。
3.2 卷积神经网络原理
3.2.1 卷积神经网络的组成
CNN由一个或多个卷积层、池化层、全连接层组成。
与其他深度学习结构相比,CNN在图像等方面能够给出更好的结果。
CNN也可以用反向传播算法进行训练。
与其他浅层或深层神经网络相比,CNN的参数更少,更容易训练。
3.2.2 卷积层(Convolutions)
- 目的:提取输入的不同特征
- 某些卷积层可能只能提取一些低级特征,如线条、边缘等,更多层的网络能从低级特征中提取更高级更复杂的特征。
- 参数
- size:卷积核(filter)大小,如3x3、5x5等
- padding:0填充,保持输出和输入的大小一致,Valid/Same
- stride:步长,卷积核每次移动的距离,通常为1
- 计算公式
- 四个超参数:Filter数量$K$、Filter大小$F$、步长$S$、0填充大小$P$
- 输入体积:$H_1 \times W_1 \times D_1$
- 输出体积:$H_2 \times W_2 \times D_2$
- $H_2 = \dfrac{H_1-F+2P}{S}+1$
- $W_2 = \dfrac{W_1-F+2P}{S}+1$
- $D_2 = K$
3.2.2.1 卷积运算
卷积运算(符号$\ast$):将一个矩阵(卷积核)应用到另一个矩阵的所有位置,求出每个位置的点积,得到一个新的矩阵。
在这个6x6的矩阵中,左边一半都是1,右边一半都是0,中间是一条非常明显的垂直边缘。
经过卷积后,得到一个4x4的矩阵,中间的值非常大,其他值非常小,表明检测到了垂直边缘。
卷积运算的产生的问题:边缘像素的信息丢失、输出的图像尺寸变小
3.2.2.2 padding-零填充
在图片像素的最外层加上$P$层0,使得卷积后的输出和输入的尺寸一致。
0对最终结果不产生影响,避免图片增加噪声。
- Valid卷积:不填充,输出尺寸减小
- Same卷积(一般采用):填充0以维持输出尺寸与原图一致
3.2.2.3 size-卷积核大小
卷积核大小$F$通常为3x3、5x5、7x7等奇数,保证能够确定一个中心点。
小卷积核可以保留更多的信息,大卷积核可以检测更大的特征。
3.2.2.4 stride-步长
步长$S$通常为1,即卷积核每次移动一个像素。
步长为2时,卷积核每次移动两个像素,输出尺寸减小,示例如下:
3.2.2.5 多通道卷积
当输入有多个通道(Channel)时(例如图片可以有 RGB 三个通道),卷积核需要拥有相同的通道数
但最终的输出只有一个通道,其结果是多个通道的卷积结果的和。
3.2.2.6 多卷积核
当有多个卷积核时,可以学习到多种不同的特征,输出结果的通道数等于卷积核的数量,多卷积核可以理解为多神经元
3.2.2.7 卷积层的运算结果
$$
\begin{split}
&Z^{[l]} = W^{[l]} \ast A^{[l-1]} + b^{[l]} \\
&A^{[l]} = g(Z^{[l]})
\end{split}
$$
3.2.3 池化层(Pooling)
池化层主要对卷积层的输出进行下采样(Subsampling)处理,主要分为:
- 最大池化(Max Pooling):取池化窗口中的最大值
- 平均池化(Average Pooling):取池化窗口中的平均值
池化通常为2x2的filter,步长为2,即每次取2x2的窗口中的最大值或平均值。
特点:没有参数,不需要学习,只是对输入数据进行简单的处理。
目的:降低数据维度;减少计算量、提高计算速度;防止过拟合,提高了鲁棒性。
3.2.4 全连接层(Fully Connected)与CNN结构
全连接层即此前提到的多层神经网络,每个神经元与上一层的所有神经元相连。
卷积层+激活层+池化层可以看成是CNN的特征学习/特征提取层,学习到的特征(Feature Map)最终应用于模型任务(分类、回归)
- 先对所有Feature Map进行扁平化(Flatten),即转化为一维向量
- 再连接到一个或多个全连接层,进行分类或回归任务
3.3 经典分类网络结构
通常采用从现成的经典网络结构进行优化,而不是从头开始设计网络结构。
- NIN:引入了1x1卷积核
- VGG:参数量巨大(1.4亿),19层网络
- GoogleNet:500万参数,22层网络
- 2014年比赛冠军的model,证明了用更多的卷积、更深的层次可以得到更好的结构
- 引入了Inception模块,多个不同大小的卷积核
3.3.1 LeNet-5
3.3.1.1 LeNet-5 网络结构
LeNet-5最初的目的用于手写数字识别,当时使用的激活函数是Sigmoid和Tanh,还没有出现Relu
3.3.1.2 参数形状
Shape | Size | Params | |
---|---|---|---|
Input | (32, 32, 1) | 1024 | 0 |
Conv1(f=5,s=1) | (28, 28, 6) | 4704 | 5x5(卷积核大小)x3(通道数)x6(卷积核数量)+6(偏置)=456 |
Pool1 | (14, 14, 6) | 1176 | 0 |
Conv2(f=5,s=1) | (10, 10, 16) | 1600 | 5x5x6x16+16=2416 |
Pool2 | (5, 5, 16) | 400 | 0 |
FC3 | (120, 1) | 120 | 400x120+120=48120 |
FC4 | (84, 1) | 84 | 120x84+84=10164 |
Output:Sofmax | (10, 1) | 10 | 84x10+10=850 |
- 中间特征值的大小变化不宜过大,否则会导致信息丢失
3.3.2 AlexNet
- 总参数量:6000万,8层神经网络,5个卷积层+3个全连接层
- 使用了非线性激活函数ReLU
- 使用Dropout防止过拟合,数据扩充
- 使用批标准化(Batch Normalization)加速训练
3.3.3 Inception结构
Inception结构是GoogleNet中的一个模块,由多个不同大小的卷积核组成,可以提取不同尺度的特征。
3.3.3.1 MLP卷积(1x1卷积)
一种新的深度网络结构Network in Network(NIN)提出了MLP卷积取代传统线性卷积核
- 1x1卷积核对每个像素点的所有通道进行了线性组合
- 激活函数将feature map由多通道的线性组合变为非线性组合(信息整合)
- 提高特征抽象能力(Multilayer Perceptron,缩写MLP,就是一个多层神经网络)
- 主要作用:调整通道数(升维降维)、减少参数量
3.3.3.2 Inception层
也称盗梦空间结构)
目的:代替人决定,使用哪种卷积核,或是需要MaxPool层,由网络自己学习寻找合适的结构,节省计算
提供以下4种不同的卷积核:
- 1x1卷积核(64个)
- 3x3卷积核(128个),padding=same
- 5x5卷积核(32个),padding=same
- 2x2最大池化(32个),stride=1,padding=same
- 最终结果为这4种卷积核的拼接,27x27x256,使用更少的参数达到和AlexNet相当的效果
3.3.3.3 Inception改进
上一节中,计算量还是太大,参数还是太多,需要进一步改进。以5x5卷积核为例:
- 上面为原方法,参数:$5\times5\times192\times32=153600$
- 下面为改进方法,网络缩小后再扩大,参数:$1\times1\times192\times16+5\times5\times16\times32=15872$
3.3.3.4 GoogleNet
Inception模块的堆叠,形成GoogleNet网络结构
详细结构略
3.4 卷积神经网络实战技巧
3.4.1 学习特征可视化
可以将网络学习过程中产生的特征图可视化出来,并且对比原图来看看每一层都干了什么
- Layer1,2:颜色、边缘等基本特征
- Layer3:纹理、形状等中级特征
- Layer4:稍复杂的特征,如狗的头部形状
- Layer5:高级特征,如关键性区分特征
3.4.2 迁移学习(Transfer Learning)
如果需要做一个具体场景的计算机视觉任务,可以使用已经训练好的模型,然后在此基础上进行微调。
3.4.2.1 介绍
迁移学习就是利用数据、任务或模型之间的相似性(例如都是图像分类任务),将在旧的领域学习过或训练好的模型,应用于新的领域的过程。
从以下两个方面考虑训练模型的现实问题:
- 数据集大小:如果新任务的数据集很小,迁移学习可以帮助提高模型的泛化能力
- 如果有海量的数据集支持,可以不需要迁移学习,直接从海量数据中训练出一个学习到一个鲁棒性很强的模型
- 但是,通常情况下,需要研究的领域数据集非常有限,导致模型的泛化能力极差
- 训练成本:从头开始训练一个CNN模型需要大量的时间和计算资源
3.4.2.2 微调(Fine-tuning)
在一个已经训练好的模型(Pre-trained Model)上进行针对性优化,以提升模型在特定任务上的性能。
假设有两个任务$A$和$B$。
任务$A$拥有海量数据,以$a$为条件区分1000个类别,已经训练好了一个模型。
目标任务为$B$,以$b$为条件区分250个类别,数据集很小。
步骤:
- 在$A$模型的基础上,将最后一层的输出层替换为250个类别的输出层,保持前面的参数不变
- 根据数据量,决定是否冻结(Freeze)前面的层(权重不变),只训练最后若干层并更新参数
- 数据越多,就保留越多的层,从后往前逐渐解冻
- 数据很少,只保留输出层,其他层全部解冻
- 重新训练模型