【深度学习_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),这两个形状的维度数量不同,因此无法进行广播。

写在最后

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

你可能感兴趣的:(#,TensorFlow深度学习,深度学习,tensorflow,人工智能)