Python深度学习02:神经网络的数学基础
2.1 初始神经网络
MNIST数据集:手写数字的灰度图像(28 像素×28 像素),包含 60 000 张训练图像和 10 000 张测试图像。
类:分类问题中的某个类别叫作类(class)
样本:数据点叫作样本(sample)
标签:某个样本对应的类叫作标签(label)
损失函数(loss function):网络如何衡量在训练数据上的性能,即网络如何朝着正确的方向前进。
优化器(optimizer):基于训练数据和损失函数来更新网络的机制。
在训练和测试过程中需要监控的指标(metric):本例只关心精度,即正确分类的图像所占的比例
使用 Keras 库,加载数据集,代码如下:
1 from keras.datasets import mnist 2 from keras import models 3 from keras import layers 4 from keras.utils import to_categorical 5 6 # 加载 Keras 中的 MNIST 数据集 7 (train_images, train_labels), (test_images, test_labels) = mnist.load_data() 8 9 #标签 10 train_labels = to_categorical(train_labels) 11 test_labels = to_categorical(test_labels) 12 13 #准备图像数据 14 train_images = train_images.reshape((60000, 28 * 28)) 15 train_images = train_images.astype('float32') / 255 16 test_images = test_images.reshape((10000, 28 * 28)) 17 test_images = test_images.astype('float32') / 255 18 19 #构建网络模型 20 network = models.Sequential() 21 network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,))) 22 network.add(layers.Dense(10, activation='softmax')) 23 24 #编译的三个参数 25 network.compile(optimizer='rmsprop', 26 loss='categorical_crossentropy', 27 metrics=['accuracy']) 28 29 #拟合模型 30 network.fit(train_images, train_labels, epochs=5, batch_size=128) 31 32 #查看测试集性能 33 test_loss, test_acc = network.evaluate(test_images, test_labels)
2.2 神经网络的数据表示
张量:当前所有机器学习系统都使用张量作为基本数据结构,张量的维度(dimension)通常叫作轴(axis)。
标量(0D 张量):仅包含一个数字的张量叫作标量(scalar)
1 import numpy as np 2 x = np.array(12) 3 x 4 5 array(12) 6 7 x.ndim 8 9 0
向量(1D 张量):数字组成的数组叫作向量(vector)或一维张量(1D 张量)。一维张量只有一个轴。
1 x = np.array([12, 3, 6, 14, 7]) 2 x 3 4 array([12, 3, 6, 14, 7]) 5 6 x.ndim 7 8 1
注:这个向量有 5 个元素,所以被称为 5D 向量。5D 向量只有一个轴,沿着轴有 5 个维度。
5D 张量有 5 个轴(沿着每个轴可能有任意个维度)。
矩阵(2D 张量):向量组成的数组叫作矩阵(matrix)或二维张量(2D 张量)。矩阵有 2 个轴(通常叫作行和列)。
1 x = np.array([[5, 78, 2, 34, 0], 2 [6, 79, 3, 35, 1], 3 [7, 80, 4, 36, 2]]) 4 5 x.ndim 6 7 2
注:[5, 78, 2, 34, 0] 是 x 的第一行, [5, 6, 7] 是第一列。
3D 张量与更高维张量:可以将其直观地理解为数字组成的立方体。
1 x = np.array([[[5, 78, 2, 34, 0], 2 [6, 79, 3, 35, 1], 3 [7, 80, 4, 36, 2]], 4 [[5, 78, 2, 34, 0], 5 [6, 79, 3, 35, 1], 6 [7, 80, 4, 36, 2]], 7 [[5, 78, 2, 34, 0], 8 [6, 79, 3, 35, 1], 9 [7, 80, 4, 36, 2]]]) 10 11 x.ndim 12 3
张量的关键属性:
形状:整数元组,表示张量沿每个轴的维度大小(元素个数)。
前面矩阵示例的形状为 (3, 5) ,3D 张量示例的形状为 (3, 3, 5) 。向量的形状只包含一个元素,比如 (5,) ,而标量的形状为空,即 () 。
数据类型:(在 Python 库中通常叫作 dtype ),张量的类型可以是 float32 、 uint8 、 float64 等。
切片:可以沿着每个张量轴在任意两个索引之间进行选择。
1 #所有图像的右下角选出 14 像素×14 像素的区域 2 my_slice = train_images[:, 14:, 14:]
2.3 神经网络的‘齿轮’:张量运算
点积
两个向量的点积:对应维度的元素相乘,再相加,结果是一个标量。
注:只有元素个数相同的向量之间才能做点积。
1 import numpy as np 2 3 x = np.array([1,2,3]) 4 y = np.array([4,5,6]) 5 z = x.dot(y) 6 z 7 8 32
计算过程:1*4+2*5+3*6=32
矩阵与向量的点积,返回一个向量。
注:“矩阵点积向量”的结果与“向量点积矩阵”的结果不同。
矩阵点积向量
1 import numpy as np 2 3 A = np.array([[1,2],[3,4]]) 4 x = np.array([5,6]) 5 6 y1 = A.dot(x) 7 y1 8 9 [17 39]
计算:[1 * 5 + 2 * 6 , 3 * 5 + 4 * 6] = [17, 39]
向量点积矩阵
1 y2 = x.dot(A) 2 y2 3 4 [23 34]
计算:[5 * 1 + 6 * 3 , 5 * 2 + 6 * 4] = [23, 24]
两个矩阵的点积:矩阵乘法
2.4 神经网络的“引擎” : 基于梯度的优化
训练(机器学习中的学习):根据反馈信号逐渐调节这些权重,这个逐渐调节的过程叫作训练。
导数:斜率 a 被称为 f 在 p 点的导数(derivative)
更新方向:想减小f(x)的值,只需将x沿着导数的反方向移动一小步。
梯度(gradient):是张量运算的导数,它是导数这一概念向多元函数导数的推广。