CNN(基于LeNet-5实例)

CNN由纽约大学的Yann LeCun于1998年提出。CNN本质上是一个多层感知机,其成功的原因关键在于它所采用的局部连接和共享权值的方式,一方面减少了的权值的数量使得网络易于优化,另一方面降低了过拟合的风险。
CNN是神经网络中的一种,的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。
二维图像处理上有众多优势,如网络能自行抽取图像特征包括颜色、纹理、形状及图像的拓扑结构;在处理二维图像问题上,特别是识别位移、缩放及其它形式扭曲不变性的应用上具有良好的鲁棒性和运算效率等。
CNN泛化能力显著优于其它方法,卷积神经网络已被应用于模式分类,物体检测和物体识别等方面。利用卷积神经网络建立模式分类器,将卷积神经网络作为通用的模式分类器,直接用于灰度图像
CNN是一个前溃式神经网络,能从一个二维图像中提取其拓扑结构,采用反向传播算法来优化网络结构,求解网络中的未知参数。
CNN是一类特别设计用来处理二维数据的多层神经网络。CNN被认为是第一个真正成功的采用多层层次结构网络的具有鲁棒性的深度学习方法。

池化(Pooling)
CNN还有一个重要思想就是池化池化层通常接在卷积层后面。池化这个词听着就很有学问,其实引入它的目的就是为了简化卷积层的输出。通俗地理解,池化层也在卷积层上架了一个窗口,但这个窗口比卷积层的窗口简单许多,不需要w,b这些参数,它只是对窗口范围内的神经元做简单的操作,如求和,求最大值,把求得的值作为池化层神经元的输入值,如下图,这是一个2*2的窗口

关键代码:

model = Sequential() # 创建网络序列
#添加第一层卷积层
model.add(Conv2D(filters=6, kernel_size=(5,5), strides=(1,1), input_shape=(28,28,1), padding='valid', activation='relu'))
                 #卷积核数量   卷积核尺寸            步长            输入形状                   填充模式        激活函数
#添加第一层池化层
model.add(AveragePooling2D(pool_size=(2,2)))
                            #池化层窗口大小
#添加第二层卷积层
model.add(Conv2D(filters=6, kernel_size=(5,5), strides=(1,1), padding='valid', activation='relu'))
#添加第二层池化层
model.add(AveragePooling2D(pool_size=(2,2)))
model.add(Flatten())        #将图片平铺为向量

# 添加两层全连接层
model.add(Dense(units=120, activation='relu'))
model.add(Dense(units=84, activation='relu'))
model.add(Dense(units=10, activation='softmax'))

CNN

LeNet-5

包

LeNet-5

训练结果