tensorflow 的字面翻译是----张量(tensor)—流(flow)
  • 为什么要引入张量的广播机制,原因是有利可图,这个利益就是
  • 能节约内存空间,说白了就是省钱!!!
  • 凡事都有两面,既然能省钱,那一定费脑子,哲学一点的说法就是’抽象’
对于张量的加法,乘法,不要求两个张量的维度完全相同,对于有很多重复元素的张量而言,可以用一个低纬度张量代表高维张量
  • 1.广播的原则
    如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,
  • 2. 或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
  • 1,2句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。

1. 两个数组各维度大小从后往前比对均一致

  • 案例一
import numpy as np
A = np.zeros((2,5,3,4))
B = np.zeros((3,4))
print((A+B).shape) # 输出 (2, 5, 3, 4)

A = np.zeros((4))
B = np.zeros((3,4))
print((A+B).shape) # 输出(3,4)
  • 案例二

张量的广播机制_深度学习

import numpy as np

arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([1, 2, 3]) #arr2.shape = (3,)
arr_sum = arr1 + arr2
print(arr_sum)



print('-'*30+'分割线'+'-'*30)
import numpy as np

arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([[1, 2, 3]]) #arr2.shape = (1,3)
arr_sum = arr1 + arr2
print(arr_sum)
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
------------------------------分割线------------------------------
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
  • 案例三
a=np.array(range(3*4*2)).reshape([3,4,2]) #shape=[3,4,2]

b=np.array([[ 0, 1], #shape=[4,2]]
[ 2, 3],
[ 4, 5],
[ 6, 7]])

c=a+b

2. 两个数组存在一些维度大小不相等时,有一个数组的该不相等维度大小为1

  • 案例一
import numpy as np

arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([[1],[2],[3],[4]]) #arr2.shape = (4, 1)

arr_sum = arr1 + arr2
print(arr_sum)

输出结果如下:
[[1 1 1]
[3 3 3]
[5 5 5]
[7 7 7]]

张量的广播机制_分割线_02

A = np.zeros((2,5,3,4))
B = np.zeros((3,1))
print((A+B).shape) # 输出:(2, 5, 3, 4)

A = np.zeros((2,5,3,4))
B = np.zeros((2,1,1,4))
print((A+B).shape) # 输出:(2, 5, 3, 4)

A = np.zeros((1))
B = np.zeros((3,4))
print((A+B).shape) # 输出(3,4)