python中张量的广播机制详解 -- 附实例

python中张量运算的广播机制
在python中,尤其是深度学习方向,在构建网络过程中,初始化参数会频繁用到

下面来看下广播的原理:

如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符其中一方的维度长度为1(但是其他维度必须相同),则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。

1.后缘纬度相同进行广播(后缘纬度就是从后开始对比矩阵维度,要求相同)
	arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
	mean1 = arr.mean(axis=0)
	print(mean1)
	
	# 后缘维度 mean1的后缘维度是3  所以会在缺失维度上进行广播,扩展到4 ---> (4,3)
	print(arr - mean1)
  
  
  out:
  [5.5 6.5 7.5]
  
  [[-4.5 -4.5 -4.5]
   [-1.5 -1.5 -1.5]
   [ 1.5  1.5  1.5]
   [ 4.5  4.5  4.5]]

这里可以看到mean1的shape是(3,), arr的shape是(4,3),他们的后缘维度都相同,所以mean1会在缺省的维度进行广播,就是把(3,)变成(4,3)然后进行运算,这里其实就是将mean1在竖直方向上复制了4份

2.其中一方的维度长度为1(但是其他维度必须相同)的广播
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
mean2 = arr.mean(axis=1)
print(mean2, mean2.shape)

print(arr - mean2)

out:
Traceback (most recent call last):
  File "/Users/.../python/tensorflow_nlp/broadcast/test.py", line 55, in <module>
    main()
  File "/Users/.../python/tensorflow_nlp/broadcast/test.py", line 24, in main
    print(arr - mean2)
ValueError: operands could not be broadcast together with shapes (4,3) (4,) 

这里会报错,因为后缘纬度一个是3,一个是4,所以没有办法进行广播

这里我们可以将mean2 的shape从(4,)变成(4,1):

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
mean2 = arr.mean(axis=1)
print(arr - mean2.reshape(4, 1))

out:
[[-1.  0.  1.]
 [-1.  0.  1.]
 [-1.  0.  1.]
 [-1.  0.  1.]]

这里我们将原mean2变成了(4,1),这样arr和mean2其中一方是1,所以会在1所在的纬度进行广播,最终mean2从(4,1)广播为(4,3),然后进行运算

3.但是需要注意的一点,以上无论是后缘维度相同还是矩阵一方维度为1,前提必须是其他纬度相同或者缺省,不一致是无法进行广播的
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
mean2 = arr.mean(axis=1)


print(mean2.reshape(1, 4))
print(arr - mean2.reshape(1, 4))

out:
Traceback (most recent call last):
  File "/Users/.../python/tensorflow_nlp/broadcast/test.py", line 55, in <module>
    main()
  File "/Users/.../python/tensorflow_nlp/broadcast/test.py", line 27, in main
    print(arr - mean2.reshape(1, 4))
ValueError: operands could not be broadcast together with shapes (4,3) (1,4)

显然mean2维度为1,但是不能广播,原因就是纬度不对应

4.多维度的广播

比如:

arr1: (2, 4, 3)
arr2: (4, 3)

arr1 = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]])
arr2 = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]])
print(arr1.shape)
print(arr2.shape)
print(arr1-arr2)

out:
(2, 4, 3)
(4, 3)
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]]

 [[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]]]

这就是关于python中张量广播的一些认识_,感谢阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值