1. 前言
在机器学习和深度学习领域中,TensorFlow 和 NumPy 是两个非常重要的库。在这两个库之间,存在一种重要的机制,名为 Broadcasting 机制,本文将针对这一机制进行详细探究。
2. Broadcasting 机制介绍
Broadcasting 机制可以使得两个不同形状的数组进行运算,而且在运算过程中,会自动地将较小的数组做扩展,从而与较大的数组具有相同的形状。这个机制的特点在于,不需要显式地将两个数组进行拓展,而是通过规则将较小的数组进行扩展。
2.1 Broadcasting 规则
Broadcasting 机制中有两个规则:
第一个规则:如果两个数组的形状在某一维度上相同,或者其中一个数组在这一维度上的形状为 1,那么这两个数组在这一维度上是可以进行运算的。
第二个规则:如果两个数组的形状不同,那么需要对较小的数组进行扩展,以便它们在所有维度上具有相同的形状。
通过这两个规则,使得Broadcasting运算够顺利地完成。
2.2 Broadcasting 的例子
下面通过一个例子来解释一下 Broadcasting。对于两个数组 $X$ 和 $Y$,其形状分别为 (5, 1) 和 (1, 3),具体如下所示:
import numpy as np
X = np.array([[1], [2], [3], [4], [5]])
Y = np.array([[1, 2, 3]])
print("X shape = ", X.shape)
print("Y shape = ", Y.shape)
#输出
X shape = (5, 1)
Y shape = (1, 3)
此时,如果执行 $X+Y$ 的操作,由于 $X$ 和 $Y$ 的形状不同,在进行相加运算时会触发 Broadcasting 机制,此时 $X$ 会在第二个维度上被扩展成 (5, 3) 的形状。
Z = X + Y
print("Z shape = ", Z.shape)
print("Z = \n", Z)
# 输出
Z shape = (5, 3)
Z =
[[2 3 4]
[3 4 5]
[4 5 6]
[5 6 7]
[6 7 8]]
我们可以发现,通过 Broadcasting 机制,原本形状不同的 $X$ 和 $Y$得以自动拓展,最终得到 $Z$ 数组的形状为 (5, 3)。
3. TensorFlow 和 NumPy 的 Broadcasting
TensorFlow 和 NumPy 都支持 Broadcasting 机制,并且在两个库中的 Broadcasting 机制近似相同。需要注意的是,TensorFlow 中的 Broadcasting 机制仅限于 TensorFlow 的计算图中。如果在 TensorFlow 之外的地方使用 Broadcasting 机制,则需要使用 NumPy 来进行扩展。下面我们以一个 TensorFlow 的例子来进行说明。
假设我们有两个张量 $a$ 和 $b$,其维度分别为 (3, 1) 和 (1, 4):
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
a = tf.constant([[1], [2], [3]])
b = tf.constant([[4, 5, 6, 7]])
print("a shape = ", a.shape)
print("b shape = ", b.shape)
可以看到,$a$ 和 $b$ 的形状分别为 (3, 1) 和 (1, 4)。此时,我们执行 $a+b$ 的操作:
c = a + b
print("c shape = ", c.shape)
with tf.compat.v1.Session() as sess:
print("c value = \n", sess.run(c))
输出结果为:
a shape = (3, 1)
b shape = (1, 4)
c shape = (3, 4)
c value =
[[ 5 6 7 8]
[ 6 7 8 9]
[ 7 8 9 10]]
我们可以看到,输出结果为一个 (3, 4) 的张量,即 Broadcasting 机制自动地对维度数更小的张量 $a$ 进行了扩展。
4. 总结
本文详细介绍了 Broadcasting 机制,同时也讲解了 TensorFlow 和 NumPy 中 Broadcasting 机制的实现。这种机制可以使得不同形状的张量进行计算,从而极大地拓展了机器学习和深度学习的应用范围。