张量广播是什么意思?有什么作用?看了这篇文章或许能给你一些启发!
当我们进行元素级操作时,两个张量的形状可能不匹配。例如,一个张量的形状是 (3, 1),另一个张量的形状是 (2, 3)。在这种情况下,它们无法直接进行操作(例如张量相加),因为形状不兼容。
tf.broadcast_to()
的作用就是帮助我们解决这个问题。它可以将一个张量自动扩展(广播)到与另一个张量具有相同形状的维度。
广播的过程就像是在张量上进行拉伸和复制,使其形状与目标形状相匹配。这样,我们就可以对两个形状不同的张量进行元素级操作,而不需要手动调整它们的形状。
tf.broadcast_to(tensor, shape)
用于将输入张量沿着指定的维度扩展,使其与给定的形状相匹配。
tensor
:作为输入张量shape
:一个形状字符串或形状列表,表示要扩展的维度。
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)
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时,无法进行广播。例如,一个张量的形状是 (3, 4)
,另一个张量的形状是 (2, 4)
,这两个形状在第一个维度上既不相等,也不为1,因此无法进行广播。
当两个张量的维度数量不匹配时,无法进行广播。例如,一个张量的形状是 (3, 4)
,另一个张量的形状是 (3, 4, 2)
,这两个形状的维度数量不同,因此无法进行广播。
点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!