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') / 25516 test_images = test_images.reshape((10000, 28 * 28))17 test_images = test_images.astype('float32') / 25518 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 np2 x = np.array(12)3 x4 5 array(12)6 7 x.ndim8 9 0
向量(1D 张量):数字组成的数组叫作向量(vector)或一维张量(1D 张量)。一维张量只有一个轴。
1 x = np.array([12, 3, 6, 14, 7])2 x3 4 array([12, 3, 6, 14, 7])5 6 x.ndim7 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.ndim6 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.ndim12 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 np2 3 x = np.array([1,2,3])4 y = np.array([4,5,6])5 z = x.dot(y)6 z7 8 32
计算过程:1*4 2*5 3*6=32
矩阵与向量的点积,返回一个向量。
注:“矩阵点积向量”的结果与“向量点积矩阵”的结果不同。
矩阵点积向量
1 import numpy as np2 3 A = np.array([[1,2],[3,4]])4 x = np.array([5,6])5 6 y1 = A.dot(x)7 y18 9 [17 39]
计算:[1 * 5 2 * 6 , 3 * 5 4 * 6] = [17, 39]
向量点积矩阵
1 y2 = x.dot(A)2 y23 4 [23 34]
计算:[5 * 1 6 * 3 , 5 * 2 6 * 4] = [23, 24]
两个矩阵的点积:矩阵乘法
2.4 神经网络的“引擎” : 基于梯度的优化
训练(机器学习中的学习):根据反馈信号逐渐调节这些权重,这个逐渐调节的过程叫作训练。
导数:斜率 a 被称为 f 在 p 点的导数(derivative)
更新方向:想减小f(x)的值,只需将x沿着导数的反方向移动一小步。
梯度(gradient):是张量运算的导数,它是导数这一概念向多元函数导数的推广。