gpt4 book ai didi

张量数组与 tf.add_n 的 python 总和

转载 作者:行者123 更新时间:2023-12-02 20:23:21 25 4
gpt4 key购买 nike

所以我有一些代码

tensors = [] //its filled with 3D float tensors
total = sum(tensors)

如果我将最后一行更改为

total = tf.add_n(tensors)

然后代码会产生相同的输出,但运行速度要慢得多,很快就会导致内存不足异常。这里发生了什么?有人可以解释内置 sum 函数和 tf.add_n 的 python 如何分别与张量数组交互,以及为什么 pythons sum 看起来只是一个更好的版本?

最佳答案

当您使用 sum 时,您调用了一个标准的 python 算法,该算法对数组的元素递归调用 __add__。由于 __add__(或 +)确实在 tensorflow 的张量上重载,它按预期工作:它创建一个可以在 session 期间执行的图形。然而,这并不是最优的,因为您添加的操作与列表中的元素一样多;此外,您强制执行操作顺序(将前两个元素添加到结果中,然后添加第三个元素,依此类推),这也不是最佳的。

相比之下,add_n 是专门用于执行此操作的操作。看着图表真的很能说明我的想法:

import tensorflow as tf

with tf.variable_scope('sum'):
xs = [tf.zeros(()) for _ in range(10)]
sum(xs)

with tf.variable_scope('add_n'):
xs = [tf.zeros(()) for _ in range(10)]
tf.add_n(xs)

enter image description here

然而——与我之前的想法相反——add_n 占用更多内存,因为它在存储它们之前等待并存储所有输入。如果输入的数量很大,那么差异可能很大。

我期望 add_n 的行为,即可用输入的总和,实际上是通过 tf.accumulate_n 实现的.这应该是更好的选择,因为它比 add_n 占用更少的内存,但不像 sum 那样强制求和的顺序。

为什么 tensorflow-wavenet 的作者使用 sum 而不是 tf.accumulate_n?当然是因为之前这个函数在 TF < 1.7 上是不可微的。因此,如果您必须支持 TF < 1.7 并且 需要内存效率,那么旧的 sum 实际上是一个不错的选择。

关于张量数组与 tf.add_n 的 python 总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com