综述
前面已经分析了神经网络基本原理和优化技巧。从这篇文章开始进入深度学习的分析。
神经网络我们可以看做是多条线性方程的叠加来分类复杂样本,在激活函数的作用下可以更好的分类出复杂的样本。深度学习来自于普通的神经网络,其基本运算还是遵循神经网络的理论的。下面就先来看一下人人都在说的卷积神经网络是怎么回事。
卷积神经网络在图像的识别方面表现的很是强大。
卷积运算
卷积运算与普通的加减运算是类似的。卷积运算时两个函数间的作用过程我们可以把其中一个函数作为标准,并把这个作用于另一个函数的各个周期中。
例如在物理中,我们有一个变化较为剧烈的频谱,也有一个小的平稳的频谱。这个频谱就会对剧烈的频谱起到约束作用。
也就是说卷积运算我们用来降噪和突出特征。下面是知乎上的文章:
https://www.zhihu.com/question/22298352
基本结构
观察上述CNN简易结构图,发现基本有输入层、卷积层、pooling层等几层组成。下面分析一下每一层的作用:
一、输入层(input layer)
在神经网络中输入层采用将多个像素拉平,逐一输入网络的方式进行数据的训练。但是在CNN中则不同,我们采用二维的方式输入,也就是保持其原本的特性输入。
比如有一张图片(忽略其颜色通道):
输入这些像素的时候我们只需要创建一个矩阵就像素点保存在里面就可以了。
那么如果考虑图片的rgb通道呢?显然创建一个三维数组就可以咯。
二、卷积层(conv layer)
输入数据后首先经过的就是卷积层。具体方法是使用一个k大小的窗口,对应一个k大小的卷积核(可以理解成权重矩阵)进行矩阵的点乘。然后窗口开始滑动,每次滑动几个像素我们成为卷积的步幅(stride)。观察下图:
K=5,每一个窗口进行一次卷积运算得到一个隐藏层的神经元。
stride = 1,每次向前滑动一个像素。再进行卷积运算。
depth:选取的K窗口的数目。我们需要多个不同的窗口来提取特征。生成多个特征图像。
上面是二维的特征,对于一个图像是个三维结构。这个地方怎么处理呢?
其实相同的啊,对于不同通道同一位置三个卷积结果做一次累加就可以了。
比如这样(其实就是两个三维矩阵想乘):
下面祭出一张神图形象的观察一下:
三、activation layer(ReLU)
- 对卷积结果做一个线性映射
- 输出结果相当于给后面的神经元一个刺激
之前分析过激活函数的问题,为了解决梯度消减这个问题我们引入了ReLU函数。那么随着神经网络层数的增加激活函数又会带来什么问题呢?
首先看一下ReLU的图像:
当x<0时,返回0.当x>0时,输入x返回x。神经网络层数加深,数据的训练轮数增加,数据整体会发生右移。那么如何对付这种右移情况呢?大牛们又提出了新的方法maxout。当然maxout功能不仅仅如此,后面再来分析一下这个方法的作用。
什么是maxout?
maxout方法是把原来固定的激活函数变成一个动态的,也就是通过调整 α 来控制激活情况。还是要看一下图像的:
通过 α 来控制x<0部分的斜率,这样在一定程度可以避免数据中心的右移。
四、Pooling layer
- 加在连续的卷积层中
- 压缩数据和参数的量,减小过拟合的风险
pooling的方法很简单,选择一个窗口。这个窗口框起来的部分,我们计算出一个值,这个值可以代表当前窗口的特性。怎么做呢?一般选最大值或者计算其平均值。工程上现在用的最多的还是最大值。
五、Full connecting layer
经过前面几层的变换,我们神经元或者说数据量也下降了。这个时候使用全连接的方法可以最大程度上保持其良好特性。
上面分析了CNN的几层,我们看一个model是怎么使用这些层数的:
观察上面的图像发现是多个层交替使用,每pooling一次数据量就下降一点。最后输出层也使用了全连接。
fine tuning
这是一种方法,现在已经好多训练好的模型。我们在做项目的时候,我们可以拿这些模型改进并使用其训练好的参数作为初始参数。这种方法叫做fine tuning。
比较好的CNN项目
LeNet、AlexNet(图像识别)、ZF Net、Google Net、VGGNet(object detection)
郑重祭出一篇博客
https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/