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):是张量运算的导数,它是导数这一概念向多元函数导数的推广。

 

posted @ 2021-01-22 19:53  vv_869  阅读(228)  评论(0编辑  收藏  举报