探秘TensorFlow 和 NumPy 的 Broadcasting 机制

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 机制的实现。这种机制可以使得不同形状的张量进行计算,从而极大地拓展了机器学习和深度学习的应用范围。

后端开发标签