能够看到,一个一维的张量与一个三维张量进行运算是彻底没有问题的,从运算结果上能够看出,至关因而三维张量中的每一行数据与张量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。这么作的好处是运算效率更高,也更节省内存。
再举一些例子加深理解: