深度学习基础:NumPy 中的广播机制和向量化

发表:2年前 更新:1年前

深度学习基础:NumPy 中的广播机制和向量化

1.广播机制

对于 array,默认对位运算,涉及多个 array 的对位运算需要 array 的维度一致,如果两个 array 维度不一致,则在没有对齐的维度上分别执行对位运算,这种机制被称为广播(Broadcasting)

>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])
>>> print(a)
[[1 2 3]
 [4 5 6]]
>>> b = np.array([[1,2,3],[1,2,3]])
>>> x = a + b
>>> print(x)
[[2 4 6]
 [5 7 9]]  #维度相同的array,对位运算
>>> c = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
>>> d = np.array([[2,2,2]])
>>> y = c + d
>>> print(y)
[[ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]  #广播机制,分别对位运算

2.向量化

向量化在深度学习的应用十分广泛,他是提升计算效率的主要手段之一,对于在机器学习中缩短每次训练的时间具有重要意义
我们以以下代码来演示一下向量化对于代码计算速度的提升:

这次涉及到 time,就不在命令行里演示了

import numpy as np
import time
v1 = np.random.rand(1000000)
v2 = np.random.rand(1000000) #初始化两个1000000维的随机向量v1和v2,用于矩阵相乘计算
result1 = 0
result2 = 0
#矩阵相乘-非向量化版本
tic = time.time()
for i in range(1000000):
    result1 += v1[i] * v2[i]
toc = time.time()
print("非向量化计算时间:" + str((toc-tic)*1000) + "ms" + "\\n" )
#矩阵相乘-向量化版本
tic = time.time()
result2 = np.dot(v1,v2)
toc = time.time()
print("向量化计算时间:" + str((toc-tic)*1000) + "ms" + "\\n" )
print("非向量化结果:"+ str(result1))
print("向量化结果:"+ str(result2))
print((result1==result2).all())

向量化版本使用 NNumPy 库的 numpy.dot()计算矩阵相乘

结果为:

非向量化计算时间:347.0184803009033ms

向量化计算时间:1.3875961303710938ms

非向量化结果:250037.25997573254
向量化结果:250037.25997572424
False

虽然上面的比对显示 False,但我们把两个结果分别打印出来即可发现,误差在 1e-7 之内,我们认为结果是正确的

我们可以看到上面向量化后效率提升非常显著,尤其是在长时间的深度学习训练中,向量化可以帮助节省更多的时间

signature
这个人没有签名
评论

无权限

请登录后评论

RunPod公众号

赞助商

联系我们

QQ群:798695907

邮箱:laravel@88.com