深度学习入门:基于 Python 的理论与实现 (13):神经网络 3.3.2

阅读数:34 2019 年 11 月 13 日 15:07

深度学习入门:基于Python的理论与实现(13):神经网络 3.3.2

内容简介
本书是深度学习真正意义上的入门书,深入浅出地剖析了深度学习的原理和相关技术。书中使用 Python3,尽量不依赖外部库或工具,从基本的数学知识出发,带领读者从零创建一个经典的深度学习网络,使读者在此过程中逐步理解深度学习。书中不仅介绍了深度学习和神经网络的概念、特征等基础知识,对误差反向传播法、卷积神经网络等也有深入讲解,此外还介绍了深度学习相关的实用技巧,自动驾驶、图像生成、强化学习等方面的应用,以及为什么加深层可以提高识别精度等疑难的问题。
本书适合深度学习初学者阅读,也可作为高校教材使用。

(矩阵乘法)

下面,我们来介绍矩阵(二维数组)的乘积。比如 2 × 2 的矩阵,其乘积可以像图 3-11 这样进行计算(按图中顺序进行计算是规定好了的)。

图 3-11 矩阵的乘积的计算方法

如本例所示,矩阵的乘积是通过左边矩阵的行(横向)和右边矩阵的列(纵向)以对应元素的方式相乘后再求和而得到的。并且,运算的结果保存为新的多维数组的元素。比如,$\boldsymbol{A}$ 的第 1 行和 $\boldsymbol{B}$ 的第 1 列的乘积结果是新数组的第 1 行第 1 列的元素,$\boldsymbol{A}$ 的第 2 行和 $\boldsymbol{B}$ 的第 1 列的结果是新数组的第 2 行第 1 列的元素。另外,在本书的数学标记中,矩阵将用黑斜体表示(比如,矩阵 $\boldsymbol{A}$),以区别于单个元素的标量(比如,$a$ 或 $b$)。这个运算在 Python 中可以用如下代码实现。

>>> A = np.array([[1,2], [3,4]])
>>> A.shape
(2, 2)
>>> B = np.array([[5,6], [7,8]])
>>> B.shape
(2, 2)
>>> np.dot(A, B)
array([[19, 22],
       [43, 50]])

这里,$\boldsymbol{A}$ 和 $\boldsymbol{B}$ 都是 2 × 2 的矩阵,它们的乘积可以通过 NumPy 的 np.dot() 函数计算(乘积也称为点积)。np.dot() 接收两个 NumPy 数组作为参数,并返回数组的乘积。这里要注意的是,np.dot(A, B)np.dot(B, A) 的值可能不一样。和一般的运算(+* 等)不同,矩阵的乘积运算中,操作数(AB)的顺序不同,结果也会不同。

这里介绍的是计算 2 × 2 形状的矩阵的乘积的例子,其他形状的矩阵的乘积也可以用相同的方法来计算。比如,2 × 3 的矩阵和 3 × 2 的矩阵的乘积可按如下形式用 Python 来实现。

>>> A = np.array([[1,2,3], [4,5,6]])
>>> A.shape
(2, 3)
>>> B = np.array([[1,2], [3,4], [5,6]])
>>> B.shape
(3, 2)
>>> np.dot(A, B)
array([[22, 28],
       [49, 64]])

2 × 3 的矩阵 $\boldsymbol{A}$ 和 3 × 2 的矩阵 $\boldsymbol{B}$ 的乘积可按以上方式实现。这里需要注意的是矩阵的形状(shape)。具体地讲,矩阵 $\boldsymbol{A}$ 的第 1 维的元素个数(列数)必须和矩阵 $\boldsymbol{B}$ 的第 0 维的元素个数(行数)相等。在上面的例子中,矩阵 $\boldsymbol{A}$ 的形状是 2 × 3,矩阵 $\boldsymbol{B}$ 的形状是 3 × 2,矩阵 $\boldsymbol{A}$ 的第 1 维的元素个数(3)和矩阵 $\boldsymbol{B}$ 的第 0 维的元素个数(3)相等。如果这两个值不相等,则无法计算矩阵的乘积。比如,如果用 Python 计算 2 × 3 的矩阵 $\boldsymbol{A}$ 和 2 × 2 的矩阵 $\boldsymbol{C}$ 的乘积,则会输出如下错误。

>>> C = np.array([[1,2], [3,4]])
>>> C.shape
(2, 2)
>>> A.shape
(2, 3)
>>> np.dot(A, C)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shapes (2,3) and (2,2) not aligned: 3 (dim 1) != 2 (dim 0)

这个错误的意思是,矩阵 $\boldsymbol{A}$ 的第 1 维和矩阵 $\boldsymbol{C}$ 的第 0 维的元素个数不一致(维度的索引从 0 开始)。也就是说,在多维数组的乘积运算中,必须使两个矩阵中的对应维度的元素个数一致,这一点很重要。我们通过图 3-12 再来确认一下。

图 3-12 在矩阵的乘积运算中,对应维度的元素个数要保持一致

图 3-12 中,3 × 2 的矩阵 $\boldsymbol{A}$ 和 2 × 4 的矩阵 $\boldsymbol{B}$ 的乘积运算生成了 3 × 4 的矩阵 $\boldsymbol{C}$。如图所示,矩阵 $\boldsymbol{A}$ 和矩阵 $\boldsymbol{B}$ 的对应维度的元素个数必须保持一致。此外,还有一点很重要,就是运算结果的矩阵 $\boldsymbol{C}$ 的形状是由矩阵 $\boldsymbol{A}$ 的行数和矩阵 $\boldsymbol{B}$ 的列数构成的。

另外,当 $\boldsymbol{A}$ 是二维矩阵、$\boldsymbol{B}$ 是一维数组时,如图 3-13 所示,对应维度的元素个数要保持一致的原则依然成立。

可按如下方式用 Python 实现图 3-13 的例子。

>>> A = np.array([[1,2], [3, 4], [5,6]])
>>> A.shape
(3, 2)
>>> B = np.array([7,8])
>>> B.shape
(2,)
>>> np.dot(A, B)
array([23, 53, 83])

图 3-13 $A$ 是二维矩阵、$B$ 是一维数组时,也要保持对应维度的元素个数一致

评论

发布