听它爹说他孩儿:Keras 学习笔记 3.1

神经网络的数学构件

这是《Deep Learning with Python》第2章的学习笔记。

首先说明一下,本书的学习笔记,是对知识要点的摘译,不是逐字逐行的全译。

任何一本技术书对于特定读者,都是有干货(有用的)也有水货(没用的)。希望尽量挤掉水分,把对我有用的记下来。

本章内容是:

  1. 神经网络的第一个范例
  2. 张量与张量的操作
  3. 神经网络通过反向传播与梯度下降进行学习

本章讲述张量和梯度下降等新概念。一定要注意,只有掌握这些概念,才能理解后面各章给出的实用范例。

神经网络的第一个范例

手写体的识别问题,是深度学习的“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% 的差距说成是过度拟合,明显不妥。

可能该用较大差距的例子来说明过度拟合。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值