CNN卷积神经网络学习笔记

最近开始从事视觉领域的研究工作,CNN(卷积神经网络)是图像处理最常用的深度学习算法,听起来比较高深的样子,但是有了之前无线通信算法的经验,理解起来也非常容易。下面把关键点记录下来,以备忘。
CNN的算法其实是很简单的,看看公式就清楚了。但为了更好的理解它,还是先从神经网络说起。神经网络顾名思义,就是很多神经元组成的网络,那神经元又是什么,和神经网络有什么关系呢。

神经元

神经元(neuron)是大脑的基本运算单元,如下面左图所示,每个神经元从树突(dendrites)收集信息,并产生输出信号沿着轴突(axon)分成多个轴突分支输出到突触与其他神经元的树突相连,形成神经网络。类比生物学上的神经元,抽象出如下面右图的神经元计算模型,xi为其他神经元的输出,与突触的作用下变为WiXi,输入到cell body,在基本模型中,他们只是简单加和,当他们的和大于某个阈值时,这个神经元就会被**,为了表示如何**,让输出的和进入一个**函数(activation function)f,比如常用的sigmoid函数,**函数后面还会再详细说明。
CNN卷积神经网络学习笔记
A cartoon drawing of a biological neuron (left) and its mathematical model (right).

神经网络

神经网络(Neural Network)是神经元分层连接起来的有向无环图,如下图所示,每一层神经元的输出是下一层神经元的输入。通常,相邻两层之间是全连接的,但同一层内的神经元是没有连接的。下面就是2个由全连接层构成的神经网络。
CNN卷积神经网络学习笔记
我们一般叫一个N层神经网络,N并不将输入层计算在内。所以,左图是2层神经网络,包含一个隐藏层和一个输出层;右图为3层神经网络,包含2层隐藏层和1层输出层。
我们经常听到的逻辑回归(logistic regression)支持向量机(SVM)是单层神经网络,而多层感知机(Multi-Layer Perceptrons, MLP)为多层神经网络。
按照上面所说,每一层的神经元最后都有一个**函数,但是最后的输出层一般没有**函数,因为最后一层通常表示一个分类(classification)的概率,或者是回归(regression)的真实的目标值,是不需要**函数再进行变换的。
神经网络输入数据和参数的个数:
输入很简单,上图左边的神经网络有3个输入数据,右边的神经网络也是3个输入数据。
而权值w和偏置bias就比较多了,与层数和连接关系有关。上图左边有2层,因为是全连接,共3*4+4*2=20个w,4+2=6个bias。同样,上图右边,共3*4+4*4+4*1=32个w,4+4+1=9个bias。

**函数(activation function)

由于每层神经元的权值w和输入x是线性关系,为了引入非线性性,在每层的输出增加**函数,**函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。下面是常用的几种**函数。
(1) sigmoid函数
公式:
CNN卷积神经网络学习笔记
曲线:
CNN卷积神经网络学习笔记
也叫 Logistic 函数,它可以将一个实数映射到(0,1)的区间,可以用以输出做二分类。
(2) Tanh函数
公式
CNN卷积神经网络学习笔记

CNN卷积神经网络学习笔记
曲线
CNN卷积神经网络学习笔记
也称为双切正切函数,取值范围为[-1,1]。
(3) ReLU
Rectified Linear Unit(ReLU) ,公式
CNN卷积神经网络学习笔记
曲线
CNN卷积神经网络学习笔记
输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入,更直观的效果如下图所示:
CNN卷积神经网络学习笔记
还有一些改进的版本:L-ReLU、P-ReLU、R-ReLU,参见:https://www.cnblogs.com/rgvb178/p/6055213.html

卷积神经网络(Convolutional Neural Network, CNN)

上面所说的全连接的神经网络在输入是较大的图像时,比如224*224*3(224*224像素,RGB3个channel),也即有224*224*3个输入神经元,那么对于全连接的网络来说,第一层隐藏层的一个神经元就需要有224*224*3个weight,如果第一层也有244*244*3个神经元的话,就需要224*224*3*224*224*3=22658678784(约2.2e10)个weight。事实上,全连接的网络是不必要或者浪费的,数量巨大的参数也会导致overfitting。
卷积神经网络很好解决了输入是图像的问题。卷积神经网络的每一层的神经元按照3维排列:width,height,depth,如下图所示。
CNN卷积神经网络学习笔记
层与层之间不再都是全连接,根据连接方式可以分为3类:卷积层,pooling层,和全连接层。全连接层一般用于最后的输出,通常也把**函数ReLU单独拿出来作为一层,下面是一个较为典型的CNN的例子,一个简单的图像分类网络。
CNN卷积神经网络学习笔记
下面分别介绍各层。
卷积层
一维卷积的卷积系数头往后移,每移一步,系数和对应位置的数据进行乘累加得到一个输出值。二维卷积的卷积系数一般叫做卷积核(kernel)或者叫filter,如下图右侧是一个3*3的filter,左侧是一个5*5的图像。
CNN卷积神经网络学习笔记
他们的卷积就是用3*3的filter依次和图像上每一个3*3的区域进行乘累加,得到3*3的输出,如下面动画所示,看不到动图,请看:http://i.imgur.com/KPyqPOB.gif
CNN卷积神经网络学习笔记
从上面可以看到,对于某一层中的一副图中的所有点,其卷积核实相同的。在扩展到3D的情况,如输入数据有5*5*3,即有3幅上图的Image,或者说输入有3Channel,那么filter也有3个,供3*3*3,每幅Image有一个3*3的filter,每幅Image的卷积结果在累加起来,输出一幅3*3的输出。如要输出也是多个channel,如输入2幅3*3的图,那么就需要3*3*3*2个filter。下面是一个例子,动图看不到请看:http://cs231n.github.io/assets/conv-demo/index.html
CNN卷积神经网络学习笔记

Pooling层