首页 > 解决方案 > TensorFlow 中的广播是视图还是副本?

问题描述

请澄清 Tensorflow 中的广播是否会在广播时分配新的内存缓冲区。

在 Tensorflow 文档Introduction to Tensors - Broadcasting中,有一句话说(强调补充):

大多数时候,广播既节省时间又节省空间,因为广播操作永远不会实现内存中扩展的张量

然而在另一句话中它说:

例如,与数学运算不同,broadcast_to 没有做任何特别的事情来节省内存。在这里,您正在物化张量

print(tf.broadcast_to(tf.constant([1, 2, 3]), [3, 3]))

tf.broadcast_to表示这是一个广播操作。

广播一个兼容形状的数组。

那么根据上面的“广播操作从不物化内存中扩展张量”的说法,它应该物化。

请帮助澄清文件实际上在说什么。

标签: tensorflowarray-broadcasting

解决方案


它说,由于时间和空间效率,通常广播操作永远不会在内存中实现扩展张量。

x = tf.constant([1, 2, 3])
y = tf.constant(2)

print(x * y)
tf.Tensor([2 4 6], shape=(3,), dtype=int32)

但是如果我们想看看它在广播后的样子,那么我们tf.broadcast_to当然需要使用哪个来实现张量。

x = tf.constant([1, 2, 3, 4])
y = tf.broadcast_to(x, [3, 4])
print(y)

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

根据文档

在进行广播操作(例如将张量乘以标量)时,广播(通常)会带来一些时间或空间优势,因为广播的张量永远不会物化

但是,bro​​adcast_to 并没有带来任何这样的好处。新创建的张量完全记忆广播的形状。(在图上下文中,broadcast_to 可能会融合到后续操作,然后被优化掉。)


推荐阅读