【经典卷积网络】(一)——LeNet-5
了解经典的神经网络架构,我相信你会对如何构建有效的卷积神经网络更有感觉。即使计算机视觉并不是你的主要方向,但我相信你 会从 ResNet和 Inception网络这样的实例中找到一些不错的想法。这里面有很多思路都是多学科融合的产物。总之,即便你不打算构建计算机视觉应用程序,试着从中发现一些有趣的思路,对你的工作也会有所帮助。
LeNet-5
首先看看LeNet-5的网络结构,假设你有一张 32×32×1的图片, LeNet-5可以识别图中的手写数字,比如像这样手写数字 7。 LeNet-5是针对灰度图片训练的,所以图片的大小只有32×32×1。
LeNet-5的卷积层1使用 6个5×5的过滤器,步幅stride为1,填充padding为 0,输出结果为 28×28×6,图像尺寸从 32×32缩小到 28×28。然后进行池化层1的操作,在这篇论文写成的那个年代,人们更喜欢使用平均池化,而现在我们可能用最大池化更多一些。在这个例子中,我们进行平均池化,过滤器的宽度为 2,步幅为 2,图像的尺寸,高度和宽度都缩小了 2倍,输出结果是一个 14×14×6的图像。
接下来是卷积层2,用一组16个 5×5的过滤器,新的输出结果有16个通道。 LeNet-5的论文是在 1998年撰写的,当时人们并不使用padding,或者总是使用 valid卷积,这就是为什么每进行一次卷积,图像的高度和宽度都会缩小,所以这个图像从14x14缩小到了10×10。然后是池化层2,高度和宽度再缩小一半,输出一个 5×5×16的图像。此时图片中的特征数量乘积是 400。
下两层层是全连接层,利用全连接层,将400个特征变为120个和84个,这就是整个模型提取出的最终特征,最后一步就是利用这84个特征得到最后的输出,我们还可以在这里再加一个节点用来预测𝑦^ 的值,𝑦^有 10个可能的值,对应识别0-9这10个数字。可以使用softmax函数输出10种类型。
这样全部下来之后,参数的数量在6万个左右,这在现代的神经网络中已经非常小了。
如果我们从左往右看,随着网络越来越深,图像的高度和宽度在缩小,从最初的32×32缩小到28×28,再到 14×14、10×10,最后只有 5×5。与此同时,随着网络层次的加深,通道数量一直在增加,从1增加到6个,再到16个。
这个经典的卷积神经网络架构中,值得我们参考的设计就是一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用。
下面给出详细地输出大小和参数的个数统计,你也可以利用我们之前的提到的公式自己计算验证一下输入和输出大小之间的关系 ⌊ n + 2 p − f s + 1 ⌋ \left\lfloor\frac{n+2p-f}{s}+1\right\rfloor ⌊sn+2p−f+1⌋
实战
MNIST数据集
MNIST 数据集是一个广泛用于训练和测试图像处理系统的大型手写数字数据库。这个数据集来源于美国国家标准与技术研究所(National Institute of Standards and Technology, NIST),经过修改和标准化后,成为了一个重要的基准数据集,特别适用于机器学习和深度学习领域,尤其是在手写数字识别任务上。
组成:
- 训练集包含 60,000 张图像。
- 测试集包含 10,000 张图像。
- 每张图像是 28x28 像素的灰度图像。
- 图像中的数字由大约 250 个不同的个体书写,包括高中学生和美国人口普查局的工作人员,确保了数据的多样性和代表性。
获取:
MNIST 数据集可以通过多种途径获取,最直接的方式是从官方网址下载:MNIST 官方网站。此外,许多机器学习库都内置了下载和加载 MNIST 数据集的功能,例如 Keras、PyTorch 等。
TensorFlow搭建LeNet5
tensorflow的具体用法不在此赘述,只展示一些具体的搭建模型的代码
# tensorflow顺序执行搭建的网络
model = tf.keras.Sequential()
# 搭建网络
model.add(tf.keras.layers.Conv2D(filters = 6,kernel_size = (5,5),input_shape=(28,28,1),padding = 'same',activation = "sigmoid"))
model.add(tf.keras.layers.AveragePooling2D(pool_size = (2, 2)))
model.add(tf.keras.layers.Conv2D(filters = 16,kernel_size = (5,5),activation = "sigmoid"))
model.add(tf.keras.layers.AveragePooling2D(pool_size = (2, 2)))
model.add(tf.keras.layers.Conv2D(filters = 120,kernel_size = (5,5),activation = "sigmoid"))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(84, activation='sigmoid'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
上述就是整个LeNet5网络的具体结构
这个模型在训练10轮之后,准确率就可以达到98.8%,让我们用这个模型来判断一下自己手写的一些数字
可以在电脑的画布上面画一个黑底白字的数字,用来验证模型,要尽量保证图形的宽高为1:1
在一个新的项目中,读取模型并利用模型判断这张图片的内容
输出表示从0到9中这个图像最有可能是哪个数字,可以看到2的可能性最大,认为判断正确、
LeNet5作为一个经典的网络,主要创新在于其使用的卷积+池化的操作现在已经被广泛使用,这些经典的网络可能实现效果不如现在一些新的网络设计,但是其设计中的精妙之处却非常值得我们借鉴。