欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

卷积神经网络(CNN)学习笔记

程序员文章站 2022-07-06 13:42:56
...

卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network )是一种深度前馈神经网络,广泛应用于图像识别和自然语言处理等方向,本文基于初学者的视角简单描述卷积神经网络的概念和原理,包含个人主观理解,如有错误恳请指正。

为何选用CNN来处理图像

传统的全连接(fully connected)网络结构在处理图像时,由于图片的二维结构,导致神经元数量大大增加,即使是100X100的图片也需要单层10000个参数,要想处理图片,必须采用新的网络架构来减少参数,避免权重爆炸的现象发生。

基于人类的常识,可以判断出在图像辨识中,某些细节往往比整张图片的其余部分重要得多,例如辨别一张图片中的鸟,我们往往观察到的是属于鸟的特征(pattrens),例如鸟喙,翅膀,爪子而非图片中的背景。CNN的设计即是这种思想的体现。

CNN的组件和基本架构

一个完整的卷积神经网络包括卷积层(Convolution)池化层(MaxPooling)全连接层(Fully Connected)。其中卷积层和池化层可以循环任意次。

和传统的神经网络一样,CNN神经元也需要激励函数(Activation Funtion),通常使用ReLU(Rectified linear unit)函数作为激励函数,其具有参数更新快,高效收敛的优点,但要小心设置学习率以避免神经元坏死。

卷积层

滤波器(filter)

CNN的卷积层神经元相当于是一个特征探测器(detector),每个神经元的前馈输入对应一个滤波器(filter)
可以指定滤波器的尺寸和每次移动的步长(stride),滤波器的设计由卷积核决定,滤波器每次移动时在原图矩阵上覆盖的部分与卷积核做卷积,之后按照步长移动滤波器,直到覆盖整个矩阵。
下图展示了一个3X3的滤波器在5X5的原图上做卷积的过程:

卷积神经网络(CNN)学习笔记

这样做正是基于特征只出现在部分区域的前提,也因此每个滤波器只需要关联图像的一部分而不是全部。对应到网络的架构上,则实现了参数共享(parameter sharing):拥有相同功能的滤波器共用参数,减少连接。

  • 每个卷积层神经元对应滤波器与覆盖位置的卷积
  • 卷积层神经元仅与覆盖位置连接
    卷积神经网络(CNN)学习笔记

在出现与滤波器相似的特征时,卷积的值会明显变大,利用此特性可以识别对应特征出现的位置。

池化层

池化层的思想事实上对应图像的采样(subsampling),目的是为了在保留图像特征的前提下降低维度,同时防止overfitting的现象发生。具体操作是划分卷积层得到的小矩阵,每一个划分中用最大的元素代替,得到更小的新矩阵 (该过程可微分)

卷积神经网络(CNN)学习笔记
对每个卷积核,都做同样的MaxPooling,将其叠加,就成为了新的图像
卷积神经网络(CNN)学习笔记
可以看出,新的图像在长宽尺寸上小于原图,而在第三维即特征维大于原图,进行一次卷积-池化后的图片相当于进行了一次特征提取,特征的数量取决于卷积核的数量,而在卷积神经网络的架构中,这样的过程会反复多次,从中不断抽取更加高级的抽象的特征。
卷积神经网络(CNN)学习笔记

卷积-池化迭代次数对结果的影响

循环次数太少,会导致全连接层的图像过大,增加训练的难度,循环次数太多,可能使图像中对象的几何关系减弱,使图像的特征受损。因此需要结合计算资源、先验估计等因素选择合适的迭代次数。

全连接层

经过卷积-池化循环得到的最终影像,将被展平(flatten)作为全连接层的输入单元。
例如5X5X50的图像,将产生1250个输入神经元,训练仍基于反向传播进行。
对于MINST数据集,最终输出为10个神经元,对于所给图像产生兴奋的神经元对应的数字即为识别结果。

卷积神经网络(CNN)学习笔记

CNN in MINST(Keras)

用Keras代码简单模拟CNN在MINST数据集上的工作流程,便于直观理解

卷积层:

model.add(Convolution2D(25,3,3,input_shape=(1,28,28))) 

(卷积参数:filter数量,filter长,fliter宽,输入图像的三维(RGB,长,宽))

得到25X26X26的image

池化层:

model.add(MaxPooling2D((2,2)))  

(池化参数:划分的尺寸)

得到25X13X13的image

二次卷积,50个3x3的fliter

得到50X11X11的image

二次池化, 2X2尺寸

得到50X5X5的image

展平50X5X5即1250个神经元

model.add(Flatten())

投入全连接网络

model.add(Dense(output_dim=100))
model.add(Activation('relu'))
model.add(Dense(output_dim=10))
model.add(Activation('softmax'))

CNN的改进

训练好的CNN模型对于手写数字图像有很好的分类效果
但使输出层神经元兴奋的不一定是数字,可能是其他满足**条件的噪声图像,因此模型只能做识别而不能生成手写数字。

对于这种情形,可以通过先验知识加上合适的限制条件
即在损失函数中加入正则项来减弱影响。

  • 本文所用图片摘自李宏毅老师的投影片,完整投影片在这里开放下载