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