【深度学习_TensorFlow】Broadcasting

写在前面

张量广播是什么意思?有什么作用?看了这篇文章或许能给你一些启发!


写在中间

一、简单介绍

当我们进行元素级操作时,两个张量的形状可能不匹配。例如,一个张量的形状是 (3, 1),另一个张量的形状是 (2, 3)。在这种情况下,它们无法直接进行操作(例如张量相加),因为形状不兼容。
tf.broadcast_to() 的作用就是帮助我们解决这个问题。它可以将一个张量自动扩展(广播)到与另一个张量具有相同形状的维度。
广播的过程就像是在张量上进行拉伸和复制,使其形状与目标形状相匹配。这样,我们就可以对两个形状不同的张量进行元素级操作,而不需要手动调整它们的形状。

二、函数讲解

tf.broadcast_to(tensor, shape) 用于将输入张量沿着指定的维度扩展,使其与给定的形状相匹配。

  • tensor:作为输入张量
  • shape:一个形状字符串或形状列表,表示要扩展的维度。

三、代码示例

  1. 首先创建两个简单的二维张量

tensor1 = tf.ones([4, 3]) tensor2 = tf.ones([4, 3])
将上面的两个张量相加,由于对应维度相同,此时两个张量的相对应行列上的数据相加,结果是一个全为值2的4行3列的张量

import tensorflow as tf
tensor1 = tf.ones([4, 3])
tensor2 = tf.ones([4, 3])
print(tensor1)
print(tensor2)
print(tensor1 + tensor2)

输出结果

tf.Tensor(
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]], shape=(4, 3), dtype=float32)
tf.Tensor(
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]], shape=(4, 3), dtype=float32)
tf.Tensor(
[[2. 2. 2.]
 [2. 2. 2.]
 [2. 2. 2.]
 [2. 2. 2.]], shape=(4, 3), dtype=float32)

  1. 接着创建两个维度相同,但形状不同的张量

tensor1 = tf.ones([3, 4]) tensor2 = tf.ones([1, 4])
将上面的两个张量相加,由于维度相同,但形状不同,直接相加会报错,因此使用broadcast函数解决,原理将上下两个张量右对齐,然后在tensor2的维度前增加一个维度1,成为二维数组,接着将tensor2的第1行复制到第2、3、4行(可以这样理解,实际上并未复制,不占用空间),使[1, 3]扩张到[4, 3],此后实现rensor1 和 tensor2的相加了

import tensorflow as tf
tensor1 = tf.ones([3, 4])
tensor2 = tf.ones([4])
print(tensor1)
print(tensor2)

tensor2 = tf.broadcast_to(tensor2, tensor1.shape)
print(tensor1 + tensor2)

输出结果

tf.Tensor(
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]], shape=(3, 4), dtype=float32)
tf.Tensor([1. 1. 1. 1.], shape=(4,), dtype=float32)
tf.Tensor(
[[2. 2. 2. 2.]
 [2. 2. 2. 2.]
 [2. 2. 2. 2.]], shape=(3, 4), dtype=float32)


四、错误广播

那么何种情况不能进行广播呢?

  1. 当两个张量在某个维度上的形状既不相等,也不为1时,无法进行广播。例如,一个张量的形状是 (3, 4),另一个张量的形状是 (2, 4),这两个形状在第一个维度上既不相等,也不为1,因此无法进行广播。

  2. 当两个张量的维度数量不匹配时,无法进行广播。例如,一个张量的形状是 (3, 4),另一个张量的形状是 (3, 4, 2),这两个形状的维度数量不同,因此无法进行广播。

写在最后

👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值