《Python深度学习》第二章读书笔记
Posted Paul-Huang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Python深度学习》第二章读书笔记相关的知识,希望对你有一定的参考价值。
2. 神经网络的数学基础
2.1. 初试神经网络
-
MNIST 数据集
包含60 000 张训练图像和10 000 张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即MNIST 中的NIST)在20 世纪80 年代收集得到黑白图像。 -
类和标签
在机器学习中,分类问题中的某个类别叫作类(class)。数据点叫作样本(sample)。某
个样本对应的类叫作标签(label)。
from keras.datasets import mnist
from keras import models
from keras import layers
from tensorflow.keras.utils import to_categorical
# 由于版本原因,这个地方很容易报错,需要加上tensorflow.
import numpy as np
def load_data():
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype(np.float32) / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype(np.float32) / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
return (train_images, train_labels), (test_images, test_labels)
(x_train, y_train), (x_test, y_test) = load_data()
network = models.Sequential()
network.add(layers.Dense(units=512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(units=10, activation='softmax'))
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
network.fit(x=x_train, y=y_train, batch_size=128, epochs=5)
test_loss, test_acc = network.evaluate(x=x_test, y=y_test)
print(network.summary())
print('test_acc:', test_acc)
print('test_loss:', test_loss)
2. 2 张量
2.2.1 定义
-
张量是机器学习程序中的数字容器,本质上就是各种不同维度的数组,我们把张量的维度称为 轴 \\color{red}轴 轴(axis),轴的个数称为 阶 \\color{red}阶 阶(rank)(也就是俗称的维度,但是为了把张量的维度和每个阶的具体维度区分开,Numpy中把轴的维度叫做数组的秩)
-
张量的形状(shape)就是 张 量 的 阶 \\color{red}张量的阶 张量的阶。
-
张量都可以通过Numpy来定义、操作。因此把Numpy数学函数库里面的数组用好,就可以搞定机器学习里面的数据结构。
- 仅包含一个 数 字 的 张 量 叫 做 标 量 \\color{red}数字的张量叫做标量 数字的张量叫做标量(scalar),既0阶张量或0D张量。标量的功能主要在于程序流程控制、设置参数值等。
- 由一组数字组成的数组叫做 向 量 \\color{red}向量 向量(vector),也就是 一 阶 张 量 \\color{red}一阶张量 一阶张量,或称1D张量。 一 阶 张 量 只 有 一 个 轴 \\color{red}一阶张量只有一个轴 一阶张量只有一个轴。
-
二
阶
张
量
有
两
个
轴
\\color{red}二阶张量有两个轴
二阶张量有两个轴,例如:向量组成的矩阵。以此类推。
Tip:
N u m p y 中 , 不 管 是 阶 的 索 引 , 还 是 数 组 的 索 引 , 永 远 是 从 0 开 始 的 。 \\color{red}Numpy中,不管是阶的索引,还是数组的索引,永远是从0开始的。 Numpy中,不管是阶的索引,还是数组的索引,永远是从0开始的。
2.2.2 关键属性
- 轴的个数(阶)。例如,3D 张量有 3 个轴,矩阵有 2 个轴。这在 Numpy 等 Python 库中
也叫张量的ndim
。 - 形状。这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。
shape
- 数据类型(在 Python 库中通常叫作 dtype )。这是张量中所包含数据的类型,例如,张
量的类型可以是 float32 、 uint8 、 float64 等。
2.2.3 张量的操作
- 切片
选择张量的特定元素叫作张量切片(tensor slicing)。 - 数据批量
- 深度学习中所有数据张量的第一个轴(0 轴,因为索引从 0 开始)都是样本轴(samples axis,有时也叫样本维度)。例如:
batch = train_images[128 * n:128 * (n + 1)]
- 深度学习中所有数据张量的第一个轴(0 轴,因为索引从 0 开始)都是样本轴(samples axis,有时也叫样本维度)。例如:
- 现实世界中的数据张量
- 向量数据: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.4 张量的运算
- 逐元素(element-wise)的运算
- 广播
如果没有歧义的话,较小的张量会被广播(broadcast),以匹配较大张量的形状。广播包含以下两步:
(1) 向较小的张量添加轴(叫作广播轴),使其 ndim 与较大的张量相同。
(2) 将较小的张量沿着新轴重复,使其形状与较大的张量相同。def naive_add_matrix_and_vector(x, y): assert len(x.shape) == 2 assert len(y.shape) == 1 assert x.shape[1] == y.shape[0] x = x.copy() for i in range(x.shape[0]): for j in range(x.shape[1]): x[i, j] += y[j] return x
- 张量点积
- 张量变形
- 用
reshape
,转置用transpose()
- 用
2.2.5 深度学习的几何解释
前面讲过,神经网络完全由一系列张量运算组成,而这些张量运算都只是输入数据的几何变换。因此,你可以将神经网络解释为高维空间中非常复杂的几何变换,这种变换可以通过许多简单的步骤来实现。
对于三维的情况,下面这个思维图像是很有用的。想象有两张彩纸:一张红色,一张蓝色。
将其中一张纸放在另一张上。现在将两张纸一起揉成小球。这个皱巴巴的纸球就是你的输入数据,每张纸对应于分类问题中的一个类别。神经网络(或者任何机器学习模型)要做的就是找到可以让纸球恢复平整的变换,从而能够再次让两个类别明确可分。通过深度学习,这一过程可以用三维空间中一系列简单的变换来实现,比如你用手指对纸球做的变换,每次做一个动作,如图2-9 所示。
2.3 神经网络的“引擎”:基于梯度的优化
- 随机梯度下降法
(1) 抽取训练样本x
和对应目标y
组成的数据批量。
(2) 在 x 上运行网络,得到预测值y_pred
。
(3) 计算网络在这批数据上的损失,用于衡量y_pred
和y
之间的距离。
(4) 计算损失相对于网络参数的梯度[一次反向传播(backward pass)]。
(5) 将参数沿着梯度的反方向移动一点,比如W -= step * gradient
,从而使这批数据上的损失减小一点。
以上是关于《Python深度学习》第二章读书笔记的主要内容,如果未能解决你的问题,请参考以下文章
Python深度学习:Python数据处理及可视化(读书笔记)