Press "Enter" to skip to content

LeNet:第一个卷积神经网络

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

「识别手写数字」是一个经典的机器学习任务,有着名的 MNIST 数据集。我们曾经利用多层感知机实现了 90+% 的准确率,本文将介绍卷积神经网络 LeNet,主要参考 这篇英文博客 的讲解。

 

LeNet 是几种神经网络的统称,它们是 Yann LeCun 等人在 1990 年代开发的。一般认为,它们是最早的 卷积神经网络 (Convolutional Neural Networks, CNNs)。模型接收灰度图像,并输出其中包含的手写数字。LeNet 包含了以下三个模型:

LeNet-1:5 层模型,一个简单的 CNN。
LeNet-4:6 层模型,是 LeNet-1 的改进版本。
LeNet-5:7 层模型,最着名的版本。

CNN 的设计是为了模拟人眼的感知方式。传统的 CNN 一般包含以下三种层:

卷积层(convolution layers)
降采样层(subsampling layers),或称池化层(pooling layers)
全连接层(fully connected layers)

它们有各自的用途,通过排列这些层,我们能实现各种 CNN。接下来,我们分别介绍这三种部件。

 

卷积层

 

卷积层利用卷积核(kernel,或称 filter)对图像进行卷积运算。每个 kernel 都是可训练的,有些 kernel 还有 bias 参数。执行卷积运算时,把 kernel 在原图上移动,步长为指定的参数 stride,有时还会做 padding。对于原图内容,将其与 kernel 先进行元素乘法,把结果求和,再加上 bias,就得到输出。

 

把原图跑完一遍之后,我们在各个位置的卷积结果,生成了特征图(feature map)。显然,kernel 越大,步长越长,padding 越小,则特征图越小。具体而言,满足:$$\text{output size} =\frac{\text{input size} – \text{kernel size} + 2\times \text{padding}}{\text{stride}} + 1$$

卷积运算。原图和 kernel 均有 3 个通道。图片来源:
Azel Daniel ,下同。

上图展示了一个典型的二维卷积。原图是 3 通道的,不填充,步长为 0。最终将生成 4×4 的 3 通道特征图。

 

池化层

 

池化层一般是不用训练的。它的目的是对特征进行降取样,显着减少特征的个数来方便学习。一般有两种池化方式:均值池化(average pooling)和最大池化(max pooling)。前者计算出一个区域的均值,后者从区域中取最大值。

池化过程。

上图展示了一个不填充、步长为 2 的池化。6×6×3 的原图在池化之后,变成了 3×3×3 的大小。

 

全连接层

 

全连接层一般用于 CNN 的最后几层,负责提取卷积和池化之后的特征。这里不过多介绍。接下来,我们开始讨论几种 LeNet。

 

LeNet-1

 

LeNet-1 仅有五个层,结构如下:

原先的 28×28 的灰度图像,先经过一个卷积层,生成 4 通道的 feature map;再进行池化降维,然后通过卷积层,得到 12 通道的 feature map。再次池化之后,用全连接层提取特征。具体参数如下:

C1:卷积层,num_kernels=4, kernel_size=5×5, padding=0, stride=1
S2:均值池化层,kernel_size=2×2, padding=0, stride=2
C3:卷积层,num_kernels=12, kernel_size=5×5, padding=0, stride=1
S4:均值池化层,kernel_size=2×2, padding=0, stride=2
F5:全连接层,out_features=10

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注