请澄清Tensorflow中的广播是否会在广播时分配新的内存缓冲区。
在Tensorflow文档《Tensors-Broadcasting简介》中,有一句话说(加了重点(:
大多数时候,广播既节省时间又节省空间,因为广播操作从未在内存中实现扩展张量
然而,在另一句话中,它说:
例如,与数学运算不同,broadcast_to在节省内存方面没有什么特别的作用。在这里,您正在具体化张量。
print(tf.broadcast_to(tf.constant([1, 2, 3]), [3, 3]))
tf.broadcast_to说这是一次广播行动。
广播兼容形状的数组。
然后根据">广播操作从不在存储器中具体化扩展张量";上面的语句,它应该而不是被具体化。
请帮助澄清文件的实际内容。
它说,由于时间和空间效率,正常广播操作永远不会在内存中实现扩展张量。
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)
根据文件
当执行广播操作(如将张量乘以标量(时,广播(通常(会带来一些时间或空间优势,因为广播的张量从未具体化。
但是,broadcast_to不附带任何此类好处。新创建的张量对广播的形状具有完整的记忆。(然而,在图形上下文中,broadcast_to可能会与后续操作融合,然后进行优化。(