任何学习都应该从接口开始,而非实现
首先从 CNN 开始。
Applied Deep Learning Resources 上列举了最新的 CNN 算法在 ImageNet 上的效果,得分最高的三个分别是 ResNet (152 layers),GoogleNet (22 layers) 和 VGG (22 weight layers)。
ResNet 网络太深,训练和测试时间太久,不适合入门。VGG 虽然层数比 GoogleNet 少,但参数(144m parameters)却比 GoogleNet(7m parameters)多太多,且效果并不如后者好。我们可以以 GoogleNet 为基准尝试 CNN 模型。但在此之前,我们先实现用于 MNIST 手写字体分类的简单 LeNet-5 模型,作为 “Hello World” 式的热身练习。
Keras 实现 LeNet-5
LeNet-5 的网络结构如下图所示:
包含卷积层、最大值池化层(Subsampling)、激活层和全连接层。
首先 import
相关库并下载 MNIST 数据:
|
|
会看到 X_train.shape
为 (60000, 28, 28), 而 X_test.shape
为 (10000, 28, 28)。图像大小 并非 LeNet-5 示意图中的 32x32 而是 28x28,我们需要对参数进行细微的调整。
参考 LeNet-5 的示意图构建模型 model
:
|
|
任何一个主流机器学习算法可由三部分组成:得分函数(score function)、损失函数(loss function)和优化算法(optimization)。以上代码中定义的 model
决定了 LeNet-5 的网络结构,实际上是它的得分函数,我们还需要指定损失函数和优化算法来学习得到模型:
|
|
在测试集上看看准确率:
|
|
不出意外的话应该在 0.99 左右。再来看看那些被错分的样本:
|
|
到此,我们就用 Keras 实现了 LeNet-5。