神经网络的数学构件
这是《Deep Learning with Python》第2章的学习笔记。
首先说明一下,本书的学习笔记,是对知识要点的摘译,不是逐字逐行的全译。
任何一本技术书对于特定读者,都是有干货(有用的)也有水货(没用的)。希望尽量挤掉水分,把对我有用的记下来。
本章内容是:
- 神经网络的第一个范例
- 张量与张量的操作
- 神经网络通过反向传播与梯度下降进行学习
本章讲述张量和梯度下降等新概念。一定要注意,只有掌握这些概念,才能理解后面各章给出的实用范例。
神经网络的第一个范例
手写体的识别问题,是深度学习的“Hello World”。
这是个分类问题,把 28x28位像素的图像区分成 0 -9 的 10 种数字。
类别与标签:数据点阵叫做样本。把类别和特定样本联系起来的叫标签。
将 MNIST 数据集载入 Keras
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 训练用数据:
>>> train_images.shape
(60000, 28, 28)
>>> len(train_labels)
60000
>>> train_labels
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
# 测试用数据:
>>> test_images.shape
(10000, 28, 28)
>>> len(test_labels)
10000
>>> test_labels
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
神经网络的构造
from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
神经网络核心构件是“层”(layer)。层是处理数据的模型,可视其为数据筛。进入层内的数据,变成有用的之后输出。
各层都从输入的数据中提取出对当前问题更有价值的含意表示。大多数深度学习网络,把多个简单的层链接起来,形成对数据的逐步筛选提纯。深度学习模型中的层,正是这种对数据多级筛选过滤的“筛子”。
在此,我们的网络用到2个 Dense 层,或叫做完全连接层。
其中,第2个层是个10路 softmax 层,它将返回一个数组。这个数组由10个概率值组成。这10个概率值加起来等于1。每个概率值表示的是当前图像对应那个数字(0-9 其中之一)的概率。
神经网络的编译
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
- 损失函数 loss : 测量网络转化训练数据的误差,和正确的转化方向。
- 优化器 optimizer :一种机制,使得网络根据当前数据和损失函数更新网络。
- 测量项 metrics :在此,我们只关心准确度(图像中有多少正确地分类了)。
损失函数和优化器将在后面两章讲解清楚。
图像数据的预处理
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
标签的预处理
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
标签的分类编码,后面第3章解说。
神经网络的训练(拟合)
>>> network.fit(train_images, train_labels, epochs=5, batch_size=128)
Epoch 1/5
60000/60000 [==============================] - 9s - loss: 0.2524 - acc: 0.9273
Epoch 2/5
51328/60000 [========================>.....] - ETA: 1s - loss: 0.1035 - acc: 0.9692
识别准确度(acc) 达到 0.989 (98.9%)。(我注:拟合训练共有5轮次,0.989 应在其他三次中得到)
神经网络的数据测试
>>> test_loss, test_acc = network.evaluate(test_images, test_labels)
>>> print('test_acc:', test_acc)
test_acc: 0.9785
测试的识别准确度为 97.8%,大大低于训练成绩。训练成绩好,测试成绩差,这就是过度拟合的表现。
过度拟合,是后面第3章的中心话题。
我的一点疑惑:
书中原文 The test-set accuracy turns out to be 97.8% — that's quite a bit lower than the training set accuracy.
把 97.8% 说成是大大低于 98.9%,这也太夸张了吧?原句中的 quite 应该删去吧?
可是,如果删去 quite,文字上是通顺了,但问题的逻辑还是不对。
把 1.1% 的差距说成是过度拟合,明显不妥。
可能该用较大差距的例子来说明过度拟合。