卷积神经网络(CNN)学习笔记
卷积神经网络(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的原图上做卷积的过程:
这样做正是基于特征只出现在部分区域的前提,也因此每个滤波器只需要关联图像的一部分而不是全部。对应到网络的架构上,则实现了参数共享(parameter sharing):拥有相同功能的滤波器共用参数,减少连接。
- 每个卷积层神经元对应滤波器与覆盖位置的卷积
- 卷积层神经元仅与覆盖位置连接
在出现与滤波器相似的特征时,卷积的值会明显变大,利用此特性可以识别对应特征出现的位置。
池化层
池化层的思想事实上对应图像的采样(subsampling),目的是为了在保留图像特征的前提下降低维度,同时防止overfitting的现象发生。具体操作是划分卷积层得到的小矩阵,每一个划分中用最大的元素代替,得到更小的新矩阵 (该过程可微分)
对每个卷积核,都做同样的MaxPooling,将其叠加,就成为了新的图像
可以看出,新的图像在长宽尺寸上小于原图,而在第三维即特征维大于原图,进行一次卷积-池化后的图片相当于进行了一次特征提取,特征的数量取决于卷积核的数量,而在卷积神经网络的架构中,这样的过程会反复多次,从中不断抽取更加高级的抽象的特征。
卷积-池化迭代次数对结果的影响
循环次数太少,会导致全连接层的图像过大,增加训练的难度,循环次数太多,可能使图像中对象的几何关系减弱,使图像的特征受损。因此需要结合计算资源、先验估计等因素选择合适的迭代次数。
全连接层
经过卷积-池化循环得到的最终影像,将被展平(flatten)作为全连接层的输入单元。
例如5X5X50的图像,将产生1250个输入神经元,训练仍基于反向传播进行。
对于MINST数据集,最终输出为10个神经元,对于所给图像产生兴奋的神经元对应的数字即为识别结果。
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模型对于手写数字图像有很好的分类效果
但使输出层神经元兴奋的不一定是数字,可能是其他满足**条件的噪声图像,因此模型只能做识别而不能生成手写数字。
对于这种情形,可以通过先验知识加上合适的限制条件
即在损失函数中加入正则项来减弱影响。
- 本文所用图片摘自李宏毅老师的投影片,完整投影片在这里开放下载
推荐阅读
-
卷积神经网络(CNN)在无人驾驶中的应用
-
tensorflow学习笔记之简单的神经网络训练和测试
-
PyTorch上实现卷积神经网络CNN的方法
-
Python神经网络TensorFlow基于CNN卷积识别手写数字
-
Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化
-
优达学城深度学习之三(下)——卷积神经网络
-
深度学习笔记二:keras+cnn+mnist cnn模型的创建、保存、调用
-
Keras学习(四)——CNN卷积神经网络
-
Numpy实现卷积神经网络(CNN)的示例
-
Keras : 利用卷积神经网络CNN对图像进行分类,以mnist数据集为例建立模型并预测