Python 中的 Numpy 的基本知识
Copyright © Microsoft Corporation. All rights reserved.
适用于 License 版权许可
更多微软人工智能学习资源, 请见微软人工智能教育与学习共建社区
以下列出一些关于 Numpy 矩阵运算的基本知识和坑点.
首先需要在命令行中安装 Numpy 库和绘图库(可选):
- pip install numpy
- pip install matplotlib
然后在 python 文件的第一行, 加入对它们的引用:
- import numpy as np
- import matplotlib.pyplot as plt
基本矩阵运算
- a=np.array([1,2,3,4,5,6]).reshape(2,3)
- b=np.array([1,1,1,1,1,1]).reshape(2,3)
- print("a:")
- print(a)
- print("b:")
- print(b)
- print("a*b:")
- print(a*b)
- print("np.multiply(a,b):")
- print(np.multiply(a,b))
- print("np.dot(a,b.T)")
- print(np.dot(a,b.T))
- # 以下这个命令会出错
- print(np.dot(a,b))
结果:
- a:
- [[1 2 3]
- [4 5 6]]
- b:
- [[1 1 1]
- [1 1 1]]
- a*b:
- [[1 2 3]
- [4 5 6]]
- np.multiply(a,b):
- [[1 2 3]
- [4 5 6]]
- np.dot(a,b.T)
- [[ 6 6]
- [15 15]]
可以看到, a*b 和 np.multiply(a,b)的作用是一样的, 都是点乘, 即两个矩阵中相对应位置的数值相乘, element wise operation. 它的输出与相乘矩阵的尺寸一致.
而 np.dot 是标准的矩阵运算,. 如果输入是(3x2)x(2x4), 则输出为 3x4. 要求 a 的列数和 b 的行数一样才能相乘, 所以我们把 b 转置了一下, b 本身是 2 行 3 列, b.T 就是 3 行 2 列, a 是 2 行 3 列, 结果是 2 行 2 列. 所以, 一定不要被 np.dot 这个函数名字迷惑了, 它不是点乘的意思.
- a=np.array([1,2,3])
- b=np.array([1,1,1]).reshape(1,3)
- print(a.shape)
- print(a*b)
- a=a.reshape(3,1)
- print(a.shape)
- print(a*b)
结果:
- (3,)
- [[1 2 3]]
- (3, 1)
- [[1 1 1]
- [2 2 2]
- [3 3 3]]
第一次定义 a 时, 是一个 1 维列向量, shape=(3,), 用 a*b 得到的结果是 shape=(1,3)的矩阵[[1 2 3]].
后来把 a.reshape(3,1)3 行 1 列的二维矩阵, 虽然表面看起来形式没变, 但是在与 b 点乘后, 得到了一个 (3,3) 的矩阵.
为了避免一些错误, 最好在每次矩阵运算前, 都把两个矩阵 reshape 成一个二维矩阵(或多维矩阵).
神经网络中的计算过程
- w=(3x2)
- w=np.array([1,2,3,4,5,6]).reshape(3,2)
- [[1 2]
- [3 4]
- [5 6]]
- b=(3x1)
- b=np.array([1,2,3]).reshape(3,1)
- [[1] [2] [3]]
- x=(2x4)(2 个特征值, 4 个样本)
- x=np.array([2,3,4,5,6,7,8,9]).reshape(2,4)
- [[2 3 4 5]
- [6 7 8 9]]
- c=np.dot(w,x)
- [[14 17 20 23]
- [30 37 44 51]
- [46 57 68 79]]
- z=c+b = np.dot(w,x) + b
注意: 这里加法有对 b 的列广播(自动扩充 b 为 4x3, 通过复制 b 的值为 3 列)
- b=
- [[1 1 1 1]
- [2 2 2 2]
- [3 3 3 3]]
- z=
- [[15 18 21 24]
- [32 39 46 53]
- [49 60 71 82]]
- y=np.array([6,5,4,3]).reshape(1,4)
4 个样本的标签值
- [[6 5 4 3]]
- dz = z - y
注意: 这里减法有对 z 的广播(通过复制 y 的值为 3 行)
- z=
- [[15 18 21 24]
- [32 39 46 53]
- [49 60 71 82]]
- y=
- [[6 5 4 3]
- [6 5 4 3]
- [6 5 4 3]]
- dz=
- [[ 9 13 17 21]
- [26 34 42 50]
- [43 55 67 79]]
- db = dz.sum(axis=1,keepdims=True)/4
4 是样本数. axis=1, 按列相加, 即一行内的所有列元素相加. 除以 4 是广播.
- [[15.]
- [38.]
- [61.]]
- dw=np.dot(dz,x.T)/4
x.T 是 x 的转置. 除以 4 是广播. dz=3x4, x.T=4x2, 结果是 3x2, 正好是 w 的 shape.
[[ 57.5 117.5]
[143. 295. ]
- [228.5 472.5]]
- w = w - 0.1*dw
- [[ -4.75 -9.75]
- [-11.3 -25.5 ]
- [-17.85 -41.25]]
- b = b - 0.1*db
- [[-0.5]
- [-1.8]
- [-3.1]]
点击这里学习更多神经网络基本课程
点击这里提交 https://github.com/Microsoft/ai-edu/issues 问题与建议
联系我们: msraeduhub@microsoft.com
来源: https://www.cnblogs.com/ms-uap/p/10602561.html