实际的卷积网络很少仅通过卷积层来构建。它们通常还有其他类型的层。最简单的是全连接层。这是一种普通的卷积网络层,其中前一层的所有输出被连接到下一层上的所有节点。通常,这些层位于网络末端。
您会在卷积网络中看到的另一种重要的层是池化层。池化层具有多种形式,但最常用的是最大池化,其中输入矩阵被拆分为相同大小的分段,使用每个分段中的最大值来填充输出矩阵的相应元素。
在上面的代码清单中,输入被拆分为 2 x 2 个象限,并应用了最大池化。因此,我可以将这个特定的操作描述为拥有一个 2 维过滤器且步幅为 2。此过程的作用是辨别出具有某个特征的广泛区域。想象这个网络正在寻找人脸。在这种情况下,您可以将这次池化的结果解释为,右下部很可能有一张人脸,左上部可能有一张人脸,右上部或左下部可能没有人脸。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
示例背景
现在,让我们通过创建一个识别图像中的手写数字的网络,解决一个简单的计算机视觉问题。这是最常用于展示神经网络强大功能的基准示例之一。该示例是用 Python 编写的,并使用了 TensorFlow 库,所以您不需要过多地关注具体的实现细节,可以更多地关注整体架构。TensorFlow 有另一个优势。它内置了 MNIST 数据集,但应该注意的是,其他机器学习框架(比如 SciKit-Learn)也做到了这一点。
对于训练和测试,我使用这个 MNIST 数据集。我使用了一个基于 LeNet-5 的相对简单的卷积网络架构。这个架构在 MNIST 数据集上实现了 0.9% 的错误率,但是我不会实现这一准确率水平,因为我将放弃 LeCun 和其他人执行的许多操作来提高网络性能,而且我还会简化架构的某些方面。