Python深度学习:基于PyTorch
上QQ阅读APP看书,第一时间看更新

1.3 Numpy的算术运算

在机器学习和深度学习中,涉及大量的数组或矩阵运算,本节我们将重点介绍两种常用的运算。一种是对应元素相乘,又称为逐元乘法(Element-Wise Product),运算符为np.multiply(),或*。另一种是点积或内积元素,运算符为np.dot()。

1.3.1 对应元素相乘

对应元素相乘(Element-Wise Product)是两个矩阵中对应元素乘积。np.multiply函数用于数组或矩阵对应元素相乘,输出与相乘数组或矩阵的大小一致,其格式如下:

numpy.multiply(x1, x2, /, out=None, *, where=True,casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj])

其中x1、x2之间的对应元素相乘遵守广播规则,Numpy的广播规则在1.7节将介绍。以下我们通过一些示例来进一步说明。

A = np.array([[1, 2], [-1, 4]])
B = np.array([[2, 0], [3, 4]])
A*B
##结果如下:
array([[ 2,  0],
       [-3, 16]])
#或另一种表示方法
np.multiply(A,B)
#运算结果也是
array([[ 2,  0],
       [-3, 16]])

矩阵A和B的对应元素相乘,由图1-2直观表示。

图1-2 对应元素相乘示意图

Numpy数组不仅可以和数组进行对应元素相乘,还可以和单一数值(或称为标量)进行运算。运算时,Numpy数组中的每个元素都和标量进行运算,其间会用到广播机制(1.7节将详细介绍)。

print(A*2.0)
print(A/2.0)

输出结果为:

[[ 2.  4.]
 [-2.  8.]]
[[ 0.5  1. ]
 [-0.5  2. ]]

由此,推而广之,数组通过一些激活函数后,输出与输入形状一致。

X=np.random.rand(2,3)
def softmoid(x):
    return 1/(1+np.exp(-x))
def relu(x):
    return np.maximum(0,x)
def softmax(x):
    return np.exp(x)/np.sum(np.exp(x))
print("输入参数X的形状:",X.shape)
print("激活函数softmoid输出形状:",softmoid(X).shape)
print("激活函数relu输出形状:",relu(X).shape)
print("激活函数softmax输出形状:",softmax(X).shape)

输出结果:

输入参数X的形状: (2, 3)
激活函数softmoid输出形状: (2, 3)
激活函数relu输出形状: (2, 3)
激活函数softmax输出形状: (2, 3)

1.3.2 点积运算

点积运算(Dot Product)又称为内积,在Numpy用np.dot表示,其一般格式为:

numpy.dot(a, b, out=None)

以下通过一个示例来说明dot的具体使用方法及注意事项。

X1=np.array([[1,2],[3,4]])
X2=np.array([[5,6,7],[8,9,10]])
X3=np.dot(X1,X2)
print(X3)

输出结果:

[[21 24 27]
 [47 54 61]]

以上运算,可用图1-3表示。

图1-3 矩阵的点积示意图,对应维度的元素个数需要保持一致

在图1-3中,矩阵X1和矩阵X2进行点积运算,其中X1和X2对应维度(即X1的第2个维度与X2的第1个维度)的元素个数必须保持一致。此外,矩阵X3的形状是由矩阵X1的行数与矩阵X2的列数构成的。