【问题标题】:Is broadcasting in Tensorflow a view or a copy?TensorFlow 中的广播是视图还是副本?
【发布时间】:2021-04-07 00:25:53
【问题描述】:

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

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

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

但是在另一句话中它说:

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

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

tf.broadcast_to 说是广播操作。

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

那么根据上面的“广播操作永远不会实现内存中扩展张量”的说法,它应该实现。

请帮助澄清文档的实际内容。

【问题讨论】:

    标签: tensorflow array-broadcasting


    【解决方案1】:

    它表示通常广播操作从不实现内存中扩展的张量,因为时间和空间效率。

    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)
    

    根据documentation

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

    但是,broadcast_to 不附带任何此类好处。新创建的张量完全记忆广播的形状。 (在图上下文中,broadcast_to 可能会融合到后续操作中,然后被优化掉。)

    【讨论】:

    • 感谢您的回答。我仍然不确定引擎盖下发生了什么。执行 (x * y) 时,x 为 rank 1,y 为 rank 0,因此将 y 广播到 rank 1 以匹配 x。这个广播可能不需要额外的内存,但结果如何(x * y)?我相信这是分配的新内存,不共享 x 或 y 的内存缓冲区。然后它需要在某个地方实现(分配缓冲区)以存储(x * y),然后它正在实现。如果是这样,“永远不会实现”如何是真的……不确定。
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多