TensorFlow的广播机制(Broadcasting)

Broadcasting 也叫广播机制(自动扩展也许更合适),它是一种轻量级张量复制的手段,在逻辑上扩展张量数据的形状,但是只要在需要时才会执行实际存储复制操作。

Broadcasting 和 tf.tile 复制的最终效果是一样的,操作对用户透明,但是 Broadcasting 机制节省了大量计算资源。

import tensorflow as tf
x = tf.random.normal([2,4])
w = tf.random.normal([4,3])
b = tf.random.normal([3])
y = x@w+b
y

<tf.Tensor: id=19, shape=(2, 3), dtype=float32, numpy=
array([[ 1.989155 , -1.2222767,  2.6319995],
       [-1.653671 ,  4.364832 ,  2.905215 ]], dtype=float32)>

上面代码中y是shape[2,3]的张量和shape[3]的张量相加,为什么没有报错呢?

这是因为它自动调用 Broadcasting函数 tf.broadcast_to(x, new_shape),将 2 者 shape 扩张为相同的[2,3],即上式等效为:

y = x@w + tf.broadcast_to(b,[2,3])

这样最终的结果就会是一个shape为[2, 3]的张量。

有了Broadcasting机制后,只要运算的逻辑都正确,shape不一致的张量哦都可以直接完成运算,Broadcasting机制并不会扰乱正常的计算逻辑。

Broadcasting 机制的核心思想是普适性,即同一份数据能普遍适合于其他位置。在验证普适性之前,需要将张量 shape 靠右对齐,然后进行普适性判断:对于长度为 1 的维度,默认这个数据普遍适合于当前维度的其他位置;对于不存在的维度,则在增加新维度后默认当前数据也是普适性于新维度的,从而可以扩展为更多维度数、其他长度的张量形状。

下面来看看Broadcasting的原理:

比如一个shape为[w, 1]的张量A,需要扩展成为shape为[b, h, w, c]的张量

首先将两个shape靠右对齐,看看是否可以广播:
在这里插入图片描述
插入新维度:

在这里插入图片描述
然后扩展为相同的长度:

在这里插入图片描述
如下的例子满足满足普适性原则,可以广播。

A = tf.random.normal([32, 1])
tf.broadcast_to(A, [2, 32, 32, 4])

<tf.Tensor: id=34, shape=(2, 32, 32, 4), dtype=float32, numpy=
array([[[[ 1.0603684 ,  1.0603684 ,  1.0603684 ,  1.0603684 ],
         [-0.36812386, -0.36812386, -0.36812386, -0.36812386],
         [ 1.6407963 ,  1.6407963 ,  1.6407963 ,  1.6407963 ],

但是如下情况不满足普适性原则,如果广播会报错:

A = tf.random.normal([32, 2])
tf.broadcast_to(A, [2, 32, 32, 4])

InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-4-97cf9a5a8ab8> in <module>
      1 A = tf.random.normal([32, 2])
----> 2 tf.broadcast_to(A, [2, 32, 32, 4])
InvalidArgumentError: Incompatible shapes: [32,2] vs. [2,32,32,4] [Op:BroadcastTo]

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值