能夠看到,一個一維的張量與一個三維張量進行運算是徹底沒有問題的,從運算結果上能夠看出,至關因而三維張量中的每一行數據與張量a進行運算,爲何能夠這樣運輸呢?這就得益於TensorFlow中的Broadcasting機制。
Broadcasting機制解除了只能維度數和形狀相同的張量才能進行運算的限制,當兩個數組進行算術運算時,TensorFlow的Broadcasting機制首先對維度較低的張量形狀數組填充1,從後向前,逐元素比較兩個數組的形狀,當逐個比較的元素值(注意,這個元素值是指描述張量形狀數組的值,不是張量的值)知足如下條件時,認爲知足 Broadcasting 的條件:
(1)相等
(2)其中一個張量形狀數組元素值爲1。
當不知足時進行運算則會拋出 ValueError: frames are not aligne 異常。算術運算的結果的形狀的每一元素,是兩個數組形狀逐元素比較時的最大值。
回到上面張量a與b相乘的例子,a的形狀是(3,),b的形狀是(2, 2, 3),在Broadcasting機制工做時,首先比較維度數,由於a的維度爲1,小於b的維度3,因此填充1,a的形狀就變成了(1,1,3),而後從最後端的形狀數組元素依次往前比較,先是就是3與3比,結果是相等,接着1與2相比,由於其中一個爲1,因此a的形狀變成了(1,2,3),繼續1與2比較,由於其中一個爲1,因此a的形狀變成了(2,2,3),a中的數據每一行都填充a原來的數據,也就是[1,2,3],而後在與b進行運算。
固然,在TensorFlow的Broadcasting機制運行過程當中,上述操做只是理論的,並不會真正的將a的形狀變成(2,2,3,),更不會將每一行填充[1,2,3],只是虛擬進行操做,真正計算時,依舊是使用原來的張量a。這麼作的好處是運算效率更高,也更節省內存。
再舉一些例子加深理解: