书籍下载qg群6089740钉钉群21734177 IT书籍http:/t.cn/RDIAj5D 2.2神经网络的数据表示 23 代码清单2-5准备标签 from keras.utils import to_categorical train_labels to_categorical(trainlabels) test_labels tocategorical(test_labels) 现在我们准备开始训练网络,在Keras中这一步是通过调用网络的fit方法来完成的 2 我们在训练数据上拟合(fit)模型。 >>network.fit(train images,train labels,epochs=5,batch size=128) Epoch 1/5 60000/60000[=============================]-9g-10gs:0.2524-acc:0.9273 Epoch 2/5 51328/60000[======= ====>.···.J-ETA:1s-10ss:0.1035-acc:0.9692 训练过程中显示了两个数字:一个是网络在训练数据上的损失(1oss),另一个是网络在 训练数据上的精度(acc)。 我们很快就在训练数据上达到了0.989(98.9%)的精度。现在我们来检查一下模型在测试 集上的性能。 >>>test loss,test acc network.evaluate(test images,test labels) >>print('test_acc:',test_acc) test acc:0.9785 测试集精度为97.8%,比训练集精度低不少。训练精度和测试精度之间的这种差距是过拟 合(overfit)造成的。过拟合是指机器学习模型在新数据上的性能往往比在训练数据上要差,它 是第3章的核心主题。 第一个例子到这里就结束了。你刚刚看到了如何构建和训练一个神经网络,用不到20行的 Pythor代码对手写数字进行分类。下一章会详细介绍这个例子中的每一个步骤,并讲解其背后 的原理。接下来你将要学到张量(输入网络的数据存储对象)入、张量运算(层的组成要素)和梯 度下降(可以让网络从训练样本中进行学习)。 2.2神经网络的数据表示 前面例子使用的数据存储在多维Numpy数组中,也叫张量(tensor)。一般来说,当前所 有机器学习系统都使用张量作为基本数据结构。张量对这个领域非常重要,重要到G0oge的 TensorFlow都以它来命名。那么什么是张量? 张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它 是数字的容器。你可能对矩阵很熟悉,它是二维张量。张量是矩阵向任意维度的推广[注意, 张量的维度(dimension)通常叫作轴(axis)]。 2.2.1标量(0D张量) 仅包含一个数字的张量叫作标量(scalar,也叫标量张量、零维张量、OD张量)。在Numpy 中,一个f1oat32或f1oat64的数字就是一个标量张量(或标量数组)。你可以用ndim属性 电子书寻找看手相钉钉或微信pythontesting
2.2 神经网络的数据表示 23 1 5 3 7 2 6 4 8 9 代码清单 2-5 准备标签 from keras.utils import to_categorical train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) 现在我们准备开始训练网络,在 Keras 中这一步是通过调用网络的 fit 方法来完成的—— 我们在训练数据上拟合(fit)模型。 >>> 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 训练过程中显示了两个数字:一个是网络在训练数据上的损失(loss),另一个是网络在 训练数据上的精度(acc)。 我们很快就在训练数据上达到了 0.989(98.9%)的精度。现在我们来检查一下模型在测试 集上的性能。 >>> test_loss, test_acc = network.evaluate(test_images, test_labels) >>> print('test_acc:', test_acc) test_acc: 0.9785 测试集精度为 97.8%,比训练集精度低不少。训练精度和测试精度之间的这种差距是过拟 合(overfit)造成的。过拟合是指机器学习模型在新数据上的性能往往比在训练数据上要差,它 是第 3 章的核心主题。 第一个例子到这里就结束了。你刚刚看到了如何构建和训练一个神经网络,用不到 20 行的 Python 代码对手写数字进行分类。下一章会详细介绍这个例子中的每一个步骤,并讲解其背后 的原理。接下来你将要学到张量(输入网络的数据存储对象)、张量运算(层的组成要素)和梯 度下降(可以让网络从训练样本中进行学习)。 2.2 神经网络的数据表示 前面例子使用的数据存储在多维 Numpy 数组中,也叫张量(tensor)。一般来说,当前所 有机器学习系统都使用张量作为基本数据结构。张量对这个领域非常重要,重要到 Google 的 TensorFlow 都以它来命名。那么什么是张量? 张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它 是数字的容器。你可能对矩阵很熟悉,它是二维张量。张量是矩阵向任意维度的推广[注意, 张量的维度(dimension)通常叫作轴(axis)]。 2.2.1 标量(0D 张量) 仅包含一个数字的张量叫作标量(scalar,也叫标量张量、零维张量、0D 张量)。在 Numpy 中,一个 float32 或 float64 的数字就是一个标量张量(或标量数组)。你可以用 ndim 属性 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
24 第2章神经网络的数学基础 来查看一个Numpy张量的轴的个数。标量张量有0个轴(ndim=0)。张量轴的个数也叫作 阶(rank)。下面是一个Numpy标量。 >>import numpy as np >>x np.array(12) >>>X array(12) >>>x.ndim 0 2.2.2向量(1D张量) 数字组成的数组叫作向量(vector)或一维张量(1D张量)。一维张量只有一个轴。下面是 一个Numpy向量。 >>x=np.array([12,3,6,14,7]) >>>X array([12,3,6,14,7]) >>x.ndim 这个向量有5个元素,所以被称为5D向量。不要把5D向量和5D张量弄混!5D向量只 有一个轴,沿着轴有5个维度,而5D张量有5个轴(沿着每个轴可能有任意个维度)。维度 (dimensionality)可以表示沿着某个轴上的元素个数(比如5D向量),也可以表示张量中轴的个 数(比如5D张量),这有时会令人感到混乱。对于后一种情况,技术上更准确的说法是5阶张量 (张量的阶数即轴的个数),但5D张量这种模糊的写法更常见。 2.2.3矩阵(2D张量)】 向量组成的数组叫作矩阵(matiⅸx)或二维张量(2D张量)。矩阵有2个轴(通常叫作行和 列)。你可以将矩阵直观地理解为数字组成的矩形网格。下面是一个Numpy矩阵。 >>x=np.array([5,78,2,34,0], [6,79,3,35,1] [7,80,4,36,2]1) >>x.ndim 2 第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)。在上面的例子中, [5,78,2,34,0]是x的第一行,[5,6,7]是第一列。 2.2.43D张量与更高维张量 将多个矩阵组合成一个新的数组,可以得到一个3D张量,你可以将其直观地理解为数字 组成的立方体。下面是一个Numpy的3D张量
24 第 2 章 神经网络的数学基础 来查看一个 Numpy 张量的轴的个数。标量张量有 0 个轴(ndim == 0)。张量轴的个数也叫作 阶(rank)。下面是一个 Numpy 标量。 >>> import numpy as np >>> x = np.array(12) >>> x array(12) >>> x.ndim 0 2.2.2 向量(1D 张量) 数字组成的数组叫作向量(vector)或一维张量(1D 张量)。一维张量只有一个轴。下面是 一个 Numpy 向量。 >>> x = np.array([12, 3, 6, 14, 7]) >>> x array([12, 3, 6, 14, 7]) >>> x.ndim 1 这个向量有 5 个元素,所以被称为 5D 向量。不要把 5D 向量和 5D 张量弄混! 5D 向量只 有一个轴,沿着轴有 5 个维度,而 5D 张量有 5 个轴(沿着每个轴可能有任意个维度)。维度 (dimensionality)可以表示沿着某个轴上的元素个数(比如 5D 向量),也可以表示张量中轴的个 数(比如 5D 张量),这有时会令人感到混乱。对于后一种情况,技术上更准确的说法是 5 阶张量 (张量的阶数即轴的个数),但 5D 张量这种模糊的写法更常见。 2.2.3 矩阵(2D 张量) 向量组成的数组叫作矩阵(matrix)或二维张量(2D 张量)。矩阵有 2 个轴(通常叫作行和 列)。你可以将矩阵直观地理解为数字组成的矩形网格。下面是一个 Numpy 矩阵。 >>> x = np.array([[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]]) >>> x.ndim 2 第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)。在上面的例子中, [5, 78, 2, 34, 0] 是 x 的第一行,[5, 6, 7] 是第一列。 2.2.4 3D 张量与更高维张量 将多个矩阵组合成一个新的数组,可以得到一个 3D 张量,你可以将其直观地理解为数字 组成的立方体。下面是一个 Numpy 的 3D 张量
书籍下载qq群6089740钉钉群21734177 IT书籍http:/t.cn/RDIAj5D 2.2神经网络的数据表示25 >>x=np.array([[[5,78,2,34,0], [6,79,3,35,1], 【7,80,4,36,2]], [5,78,2,34,0], [6,79,3,35,1], [7,80,4,36,2]] [[5,78,2,34,0], [6,79,3,35,1], 2 [7,80,4,36,2]]1) >>>x.ndim 3 将多个3D张量组合成一个数组,可以创建一个4D张量,以此类推。深度学习处理的一般 是0D到4D的张量,但处理视频数据时可能会遇到5D张量。 2.2.5关键属性 张量是由以下三个关键属性来定义的。 口轴的个数(阶)。例如,3D张量有3个轴,矩阵有2个轴。这在Numpy等Python库中 也叫张量的ndim。 口形状。这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。例如,前面矩 阵示例的形状为(3,5),3D张量示例的形状为(3,3,5)。向量的形状只包含一个 元素,比如(5,),而标量的形状为空,即()。 口数据类型(在Python库中通常叫作dtype)。这是张量中所包含数据的类型,例如,张 量的类型可以是f1oat32、uint8、f1oat64等。在极少数情况下,你可能会遇到字符 (char)张量。注意,Numpy(以及大多数其他库)中不存在字符串张量,因为张量存 储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。 为了具体说明,我们回头看一下MNIST例子中处理的数据。首先加载MNIST数据集。 from keras.datasets import mnist (train_images,train_labels),(test_images,test_labels)mnist.load_data() 接下来,我们给出张量train_images的轴的个数,即ndim属性。 >>print(train images.ndim) 3 下面是它的形状。 >>print(train_images.shape) (60000,28,28) 下面是它的数据类型,即dtype属性。 >>>print(train images.dtype) uint8 所以,这里train_images是一个由8位整数组成的3D张量。更确切地说,它是60000 电子书寻找看手相钉钉或微信pythontesting
2.2 神经网络的数据表示 25 1 5 3 7 2 6 4 8 9 >>> x = np.array([[[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]], [[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]], [[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]]]) >>> x.ndim 3 将多个 3D 张量组合成一个数组,可以创建一个 4D 张量,以此类推。深度学习处理的一般 是 0D 到 4D 的张量,但处理视频数据时可能会遇到 5D 张量。 2.2.5 关键属性 张量是由以下三个关键属性来定义的。 轴的个数(阶)。例如,3D 张量有 3 个轴,矩阵有 2 个轴。这在 Numpy 等 Python 库中 也叫张量的 ndim。 形状。这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。例如,前面矩 阵示例的形状为 (3, 5),3D 张量示例的形状为 (3, 3, 5)。向量的形状只包含一个 元素,比如 (5,),而标量的形状为空,即 ()。 数据类型(在 Python 库中通常叫作 dtype)。这是张量中所包含数据的类型,例如,张 量的类型可以是 float32、uint8、float64 等。在极少数情况下,你可能会遇到字符 (char)张量。注意,Numpy(以及大多数其他库)中不存在字符串张量,因为张量存 储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。 为了具体说明,我们回头看一下 MNIST 例子中处理的数据。首先加载 MNIST 数据集。 from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.load_data() 接下来,我们给出张量 train_images 的轴的个数,即 ndim 属性。 >>> print(train_images.ndim) 3 下面是它的形状。 >>> print(train_images.shape) (60000, 28, 28) 下面是它的数据类型,即 dtype 属性。 >>> print(train_images.dtype) uint8 所以,这里 train_images 是一个由 8 位整数组成的 3D 张量。更确切地说,它是 60 000 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
26第2章神经网络的数学基础 个矩阵组成的数组,每个矩阵由28×28个整数组成。每个这样的矩阵都是一张灰度图像,元素 取值范围为0-255。 我们用Matplotlib库(Python标准科学套件的一部分)来显示这个3D张量中的第4个数字, 如图2-2所示。 代码清单2-6显示第4个数字 digit train images[4] import matplotlib.pyplot as plt plt.imshow(digit,cmap=plt.cm.binary) plt.show() 15 20 10152025 图2-2数据集中的第4个样本 2.2.6 在Numpy中操作张量 在前面的例子中,我们使用语法train_images[i]来选择沿着第一个轴的特定数字。选 择张量的特定元素叫作张量切片(tensor slicing)。我们来看一下Numpy数组上的张量切片运算。 下面这个例子选择第10-100个数字(不包括第100个),并将其放在形状为(90,28, 28)的数组中。 >>>my_slice train_images[10:100] >>print(myslice.shape) (90,28,28】 它等同于下面这个更复杂的写法,给出了切片沿着每个张量轴的起始索引和结束索引。 注意,:等同于选择整个轴。 >my_s1ice=train_.images[10:100,:,:】g☐等同于前面的例子 >>>my_slice.shape (90,28,28) >>my_s1ice=train_images[10:100,0:28,0:28】g也等同于前面的例子 >>my_slice.shape (90,28,28)
26 第 2 章 神经网络的数学基础 个矩阵组成的数组,每个矩阵由 28×28 个整数组成。每个这样的矩阵都是一张灰度图像,元素 取值范围为 0~255。 我们用 Matplotlib 库(Python 标准科学套件的一部分)来显示这个 3D 张量中的第 4 个数字, 如图 2-2 所示。 代码清单 2-6 显示第 4 个数字 digit = train_images[4] import matplotlib.pyplot as plt plt.imshow(digit, cmap=plt.cm.binary) plt.show() 图 2-2 数据集中的第 4 个样本 2.2.6 在 Numpy 中操作张量 在前面的例子中,我们使用语法 train_images[i] 来选择沿着第一个轴的特定数字。选 择张量的特定元素叫作张量切片(tensor slicing)。我们来看一下 Numpy 数组上的张量切片运算。 下面这个例子选择第 10~100 个数字(不包括第 100 个),并将其放在形状为 (90, 28, 28) 的数组中。 >>> my_slice = train_images[10:100] >>> print(my_slice.shape) (90, 28, 28) 它等同于下面这个更复杂的写法,给出了切片沿着每个张量轴的起始索引和结束索引。 注意,: 等同于选择整个轴。 >>> my_slice = train_images[10:100, :, :] >>> my_slice.shape (90, 28, 28) >>> my_slice = train_images[10:100, 0:28, 0:28] >>> my_slice.shape (90, 28, 28) 等同于前面的例子 也等同于前面的例子
书籍下载qg群6089740钉钉群21734177 IT书籍http:/t.cn/RDIAj5D 2.2神经网络的数据表示 27 一般来说,你可以沿着每个张量轴在任意两个索引之间进行选择。例如,你可以在所有图 像的右下角选出14像素×14像素的区域: my_slice train_images[:,14:,14: 也可以使用负数索引。与Pythot列表中的负数索引类似,它表示与当前轴终点的相对位置。 你可以在图像中心裁剪出14像素×14像素的区域: my_slice train_images[:,7:-7,7:-7] 2.2.7 数据批量的概念 通常来说,深度学习中所有数据张量的第一个轴(0轴,因为索引从0开始)都是样本轴 (samples axis,有时也叫样本维度)。在MNIST的例子中,样本就是数字图像。 此外,深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量。具体来看,下 面是MNIST数据集的一个批量,批量大小为128。 batch train images[:128] 然后是下一个批量。 batch train images[128:256] 然后是第n个批量。 batch train images[128 n:128(n 1)] 对于这种批量张量,第一个轴(0轴)叫作批量轴(batch axis)或批量维度(batch dimension)a 在使用Keras和其他深度学习库时,你会经常遇到这个术语。 2.2.8现实世界中的数据张量 我们用几个你未来会遇到的示例来具体介绍数据张量。你需要处理的数据几乎总是以下类 别之一。 口向量数据:2D张量,形状为(samples,features)。 口时间序列数据或序列数据:3D张量,形状为(samples,timesteps,features)。 口图像:4D张量,形状为(samples,height,width,channels)或(samples,channels, height,width)o ▣视频:D张量,形状为(samples,frames,height,width,channels)或(samples, frames,channels,height,width)o 2.2.9 向量数据 这是最常见的数据。对于这种数据集,每个数据点都被编码为一个向量,因此一个数据批 量就被编码为2D张量(即向量组成的数组),其中第一个轴是样本轴,第二个轴是特征轴。 电子书寻找看手相钉钉或微信pythontesting
2.2 神经网络的数据表示 27 1 5 3 7 2 6 4 8 9 一般来说,你可以沿着每个张量轴在任意两个索引之间进行选择。例如,你可以在所有图 像的右下角选出 14 像素×14 像素的区域: my_slice = train_images[:, 14:, 14:] 也可以使用负数索引。与 Python 列表中的负数索引类似,它表示与当前轴终点的相对位置。 你可以在图像中心裁剪出 14 像素×14 像素的区域: my_slice = train_images[:, 7:-7, 7:-7] 2.2.7 数据批量的概念 通常来说,深度学习中所有数据张量的第一个轴(0 轴,因为索引从 0 开始)都是样本轴 (samples axis,有时也叫样本维度)。在 MNIST 的例子中,样本就是数字图像。 此外,深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量。具体来看,下 面是 MNIST 数据集的一个批量,批量大小为 128。 batch = train_images[:128] 然后是下一个批量。 batch = train_images[128:256] 然后是第 n 个批量。 batch = train_images[128 * n:128 * (n + 1)] 对于这种批量张量,第一个轴(0 轴)叫作批量轴(batch axis)或批量维度(batch dimension)。 在使用 Keras 和其他深度学习库时,你会经常遇到这个术语。 2.2.8 现实世界中的数据张量 我们用几个你未来会遇到的示例来具体介绍数据张量。你需要处理的数据几乎总是以下类 别之一。 向量数据:2D 张量,形状为 (samples, features)。 时间序列数据或序列数据:3D 张量,形状为 (samples, timesteps, features)。 图像:4D 张量,形状为 (samples, height, width, channels) 或 (samples, channels, height, width)。 视频:5D 张量,形状为 (samples, frames, height, width, channels) 或 (samples, frames, channels, height, width)。 2.2.9 向量数据 这是最常见的数据。对于这种数据集,每个数据点都被编码为一个向量,因此一个数据批 量就被编码为 2D 张量(即向量组成的数组),其中第一个轴是样本轴,第二个轴是特征轴。 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting