【Yolo的听课笔记二】七月在线 深度学习第四期 卷积神经网络与典型结构
我是刚刚接触计算机视觉的小白Yolo,很多知识都处于摸索阶段。为了记录自己的学习历程,我在这里把自己的学习内容进行总结.
听课笔记系列是为了整理自己在各个课程中的笔记,主要是回顾课堂内容,也融入了一些自己的理解和网上资料参考。
目录
卷积神经网络CNN广泛应用于图像处理,与其他神经网络相比近乎是碾压式的存在。因此本节课,我们来探讨一下卷积神经网络的基本原理和典型结构。
CNN和DNN
DNN是否可以运用于图像处理
严格来说,DNN也可以用于图像处理,对于一张输入的图片,我们将其拉成一个长条输入DNN中,并对其设置必要的隐层和其他结构,便可以利用它来进行图像处理。理论上似乎这个过程没有任何问题,但当我们具体应用时,就会发现这其中困难重重。
对于一张32*32*3大小的图片,假设隐含层个数为1024层,则其权重个数为:
1. 算不动 :当参数个数过多时,使用CPU训练时所需时间太长,而GPU的训练成本太大,无法大规模应用。
2. 过拟合 :当模型过于复杂,训练样本数目不足时就会导致过拟合现象。
而卷积神经网络在解决这两个问题具有很大的优势。
卷积神经网络的层级结构
卷积神经网络保留了DNN的层级结构,而且不同层次有不同形式(运算)与功能,我们可以认为卷积神经网络是传统神经网络的一个改进。它相对于许多传统神经网络而言增加了许多层次,如下图:
一般来说,卷积神经网络具有如下结构:
我们将在下文对这几个层分别进行讨论。
数据输入层(Input layer)
数据输入层是卷积神经网络的第一层,这层主要是对输入图像进行预处理。在机器学习中,常见的数据处理方式有归一化、scaling、离散值、降噪等。在卷积神经网络中,我们主要有如下3种常见的数据处理方式:
去均值
我们把每个数据都减去他们的均值,从而让输入数据各个维度都中心化到0,把样本的中心拉回到坐标系原点上,让数据不会随着变化发生偏移。这是一种在图像中经常用到的预处理手段。这个操作一定是在训练集中进行,且训练集和测试集都需要减去训练集的均值。在图像处理中可以分为以下两类:
1. image mean :对于一张输入图片,我们把训练集同一个空间位置上的所有像素的对应通道都求了均值。在处理前后图片的大小保持不变,即当输入图片是时,我们求出的image mean也是。Alexnet神经网络的去均值就是用了这种方法。
2. pixel mean :对于一张输入图片,我们把这张图片在R、G、B这三个通道中的所有像素分别求均值,不再考虑空间位置。经过pixel mean我们求出来三个数值是(R_mean,G_mean,B_mean),所以pixel mean就相当于把image mean得到的结果再求了一次均值。
归一化
通过这个处理操作,可以把幅度归一化到同样的范围,归一化在图像处理中运用的不是很多。在处理图像问题时,我们经常会乘以,这类似于将图像做一个幅值缩放,可以看成是广义的归一化处理。
PCA/白化
利用PCA可以实现降维,而白化是对数据每个特征轴上的幅度归一化。
在输入层中,一般进行resize、去均值、scaling等操作,把图像放缩成同样大小的图片然后输入神经网络中。
卷积计算层(CONV layer)
卷积计算层是卷积神经网络的核心部分,卷积计算层的两个核心操作包括局部感知和窗口滑移。 在卷积计算层中,我们取滑窗(感知野)对所有的数据进行连接,这个过程相当于固定一组w,与输入图像做运算。在这里我们分别对这两个操作进行解释。
1. 局部感知 :在传统神经网络DNN中,图片上的每个像素点都与神经网络相连,从而产生大量的参数,给训练过程带来麻烦。实际上,这种全连接并不是必须的,图像本身具有一定的局部特性(比如我们在看一张猫的图片时,我们不需要看完整张图片,找出猫的鼻子、耳朵、爪子之后才可以下结论:原来这是一只猫呀!我们只需要看图片的一部分就能得出正确结论。从这个角度出发,我们在这一层设计了局部感知这一个操作。在卷积计算层中,我们将每个神经元看做一个滤波器(filter、或称为卷积核),每一个神经元都只和部分像素进行计算,这样就极大了减少了参数的数目。下面这张图可以帮助我们很好的理解这一个过程:
2. 窗口滑移 :在得到卷积核之后,卷积核的窗口在图像上不断滑动,从而得到一定大小的feature map。每个卷积层可以有多个fillter,每个fillter和原始图像做卷积之后,都可以得到一个feature map,因此,卷积后feature map的个数和卷积层的fillter的个数是相同的。
我们需要特别注意以下这些概念:
1. 深度/depth :第二层神经元的个数称为深度,每个神经元与前面的数据连接得到feature maps
2. 步长/stride :每次滑窗滑动的距离称为步长
3. 填充值/zero-padding :我们在矩阵边上填充的数字,一般用0进行填充。
在介绍完相关概念之后,我们来看一下卷积计算层中的卷积计算到底是如何进行的.简单来说,就是将图像和滑窗对应做乘积然后加和。如下图:
这个过程可以由如下动图做直观解释,输入大小为,经过两个大小的filter卷积(步幅为2),得到了的输出.
接下来我们介绍卷积神经网络的参数共享机制
这个机制主要有以下几个特点:
• 在卷积层中每个神经元连接数据窗的权重是固定的。
• 每个神经元都只关注一个特性。神经元就是图像处理中的滤波器,每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等这些特征加起来就构成了这个图像。
• 参数共享机制大大减少了需要估算的权重个数,比如在 AlexNet中,参数由 1亿减少到 3.5w个,大大的减轻了训练难度。
• 一组固定的权重和不同窗口内数据做内积就称为卷积。
激励层
对于卷积计算层得到的数据,我们将其输入激励层,激励层对这些数据做非线性映射。
常见的非线性映射函数有Sigmoid 、tanh(双曲正切) ReLU、Leaky ReLU、ELU
Maxout等。
这里有几点需要特别注意的地方:
② ③ ④
1. CNN慎用sigmoid!慎用sigmoid!慎用sigmoid
对比sigmoid的图像我们可以发现,当sigmoid函数的x过大或过小时,这个函数的梯度都会变为0(梯度消失、梯度弥散),使卷积设计网络的参数更新受阻,尤其是当层数很多时,此时sigmoid函数扮演了一个猪队友的角色。
2. 首先试RELU,因为快,但要小心点
与sigmoid函数相比,Relu出现梯度为0 的区域更小,因此一般来说我们首先考虑Relu,但仍有出现猪队友的可能性。
3. 如果2失效,请用Leaky ReLU或者Maxout
这两个函数都针对出现猪队友的情况进行优化,因此效果挺好。尤其是Leaky ReLU函数,它的数学特性非常好,求导方便
4. 某些情况下tanh倒是有不错的结果,但是很少
池化层
池化层位于连续的卷积计算层中间, 它用于压缩数据和参数的量,便于训练同时减小过拟合发生。对于图像而言,当卷积神经网络的池化层主要用于对图像进行压缩。
如上图所示,表示上一层的depth为64,经过feature map中做下采样depth保持不变,但是下采样有可能丢失信息。
池化层的方法
池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。
1. Max pooling :
对feature map内特征点,Max Pooling只取其中最大,其他特征值全部丢弃。直观来说,Max Pooling只保留数据中最明显的特征。
2. average pooling :
每个feature map内部取平均,每个feature map变成一个值,减少了许多数据。
两种池化层的方法如下图所示。
全连接层/ FC layer
两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的。
典型的CNN结构
典型的CNN结构包括如下四个组成部分:
卷积神经网络卷积层可视化理解
一开始,输入图像被送入convnet,并计算各层feature maps的activation。然后,对于convnet中指定层中的feature map,把该层中其余的feature maps的activations全部置零,之后,将该层所有的feature maps作为输入,传递到随后的deconvnet网络中。经过随后的unpool,rectify,filter的处理,一直计算到输入图像的像素空间即可。
卷积神经网络训练算法
同一般机器学习算法,先定义Loss function,衡量和实际结果之间差距。找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)
卷积神经网络优缺点
卷积神经网络的优点
- 共享卷积核,优化计算量
- 无需手动选取特征,训练好权重,即得特征
- 深层次的网络抽取图像信息丰富,表达效果好
卷积神经网络的缺点
- 需要调参,需要大样本量,GPU等硬件依赖
- 物理含义不明确
正则化与Dropout
Droupt在过拟合的应用
当参数的搜索空间过大,神经网络学习能力强时可能会发生过拟合。在机器学习中,我们常使用L1范数或L2范数来解决这个问题。在CNN中,我们主要应用的是Dropout。
Dropout一般加载全连接层的最后部分,由于过拟合是由于参数的搜索空间过大导致的,因此我们利用Dropout让所有学习单元不是一次性开启。
在很多应用场景,预测阶段所需要的时间非常影响用户体验。举例来说,对于电商平台而言,当用户在搜索过程中消耗的时间过长时,他很可能会选择卸载应用。为了解决这个问题,提高用户的使用体验,我们在实际应用过程中常常把预测阶段的时间转移到训练上。这一部分的代码如下::
对Droupt的理解
-
防止过拟合的第1种理解方式 :别让你的神经网络记住那么多东西(虽然CNN记忆力好),学习的过程中,保持泛化能力。
我们知道,引发过拟合的原因是数据的搜索空间太大。因此我们可以在训练时不要让CNN一次性喂入那么多数据,如上图为例,我们可以先选择一些猫的特征输入神经网络中进行训练。 -
防止过拟合的第2种理解方式 :每次都关掉一部分感知器,得到一个新模型,最后做融合。不至于听一家所言。这个过程有点类似于随机森林,对最后的特征进行融合。
卷积神经网络典型CNN
卷积神经网络的分类
典型的CNN结构包括如下几类:
CNN结构的不断完善大幅提高了卷积神经网络的效率。
卷积神经网络调优训练
由于神经网络的训练涉及到大量的参数,因此卷积神经网络的训练过程是一个非常耗费计算量的问题,这个过程也涉及到一定的技巧,并不用是轻而易举就可以实现CNN的训练。为了方便卷积神经网络的应用,提出了一种调优训练方法(fine tune)。我们可以利用很多已经训练好的神经网络,保留相关参数不变,把最后的全连接层去掉换成所需要的层,然后在训练集上进行微调即可。这个过程其实是一种简单的迁移学习,它既可以减小训练的困难,又可以避免因为训练集过小导致的过拟合问题。