卷积神经网络(CNN)
最近可能会用到CNN,今天回顾一下,并找到了一些大神的精华帖,顺便做个总结。
CNN是时下非常火的一种深度学习算法,它是一种前馈神经网络,即神经元只与前后层有联系,在同一层的神经元无联系。笔者用下面这张图用来说明卷积神经网络的工作原理
这是一个识别字母的CNN结构图,最左边是32*32像素的输入,然后经过了6个隐含层,最终得到输出,输出有10个类别,分别是要识别的10个字母的标记。假设我们已经训练好CNN,那么从输入到C1层有6个特征映射,也就是分别用6个训练好的卷积核分别对32*32的输入做了4个特征抽取(或者称为4次扫描),扫描的过程是这样的:将卷积核左上角与输入图片左上角重叠,然后向右或向下依次移动striding个单位(这里以strding=1为例来说明),这样可以得到28*28的输出,下面这张图表示了卷积计算的过程:
卷积核与输入像素对应位置的值相乘,然后求和就得到了一次卷积计算的输出。实际得到的特征输出还需要在此基础上加一个偏置(bias),然后以此作为sigmoid函数的参数,计算得到的sigmoid函数的输出才是对应特征输出的结果,这样做目测是为了方便后续的训练,因为训练过程需要各种求导。。
我们做卷积运算也只是对输入图片做了一次模糊处理(可以叫特征抽象),这一步操作可以取到一些边缘特征。这样做在得到6组28*28的特征输出之后,还需要对卷积计算后的28*28的特征做一次池化(pooling),得到了S2层,这样做的目的是可以保证旋转不变形,(比如克服猫耳朵旋转或者因为拍摄角度不同而造成的影响)。池化有很多种方法,比如可以选择Max-Pooling(范围内最大值)或者L2-Pooling(范围内每个值的平方和的平方根),这里得到S2层选择的是一个2*2的邻域做池化。
第一次池化完成后可以跟着连续n个卷积-池化的操作,从最后的隐含层到输出层的时候是一个类似于BP神经网络的全连接(每个隐含层的神经元与输出神经元的全连接)。
在卷积-池化的过程中,可以想象某一次的卷积操作完全覆盖了字母A的特征,那么下一步的池化可以保证字母A一动一下位置也能识别,这样保证了平移不变性(个人理解)>
CNN的训练和BP神经网络一样也是反向传播,关于反向传播,可以参考上一篇BP神经网络,这里不再赘述。
总之,CNN的过程特征抽象与特征泛化的交替进行,有了池化,才不至于过拟合!