Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
张量数组上的python求和vs.tf.add\n_Python_Tensorflow - Fatal编程技术网

张量数组上的python求和vs.tf.add\n

张量数组上的python求和vs.tf.add\n,python,tensorflow,Python,Tensorflow,所以我有一些代码 tensors = [] //its filled with 3D float tensors total = sum(tensors) 如果我把最后一行改成 total = tf.add_n(tensors) 然后,代码生成相同的输出,但运行速度要慢得多,而且很快就会导致错误 内存不足异常。这是怎么回事?有人能解释一下python内置的sum函数和tf.add\n是如何分别与张量数组交互的,以及为什么python sum看起来只是一个更好的版本吗?唯一的方法是使用iter

所以我有一些代码

tensors = [] //its filled with 3D float tensors
total = sum(tensors)
如果我把最后一行改成

total = tf.add_n(tensors)
然后,代码生成相同的输出,但运行速度要慢得多,而且很快就会导致错误 内存不足异常。这是怎么回事?有人能解释一下python内置的sum函数和tf.add\n是如何分别与张量数组交互的,以及为什么python sum看起来只是一个更好的版本吗?

唯一的方法是使用iterables,因此在内存配置文件方面,它似乎获得了使用生成器的优势

for-tensor获取一个张量列表,并且似乎在整个处理过程中根据形状比较的要求保留该数据结构

In [29]: y = [1,2,3,4,5,6,7,8,9,10]  

In [30]: y.__sizeof__()
Out[30]: 120

In [31]: x = iter(y)

In [32]: x.__sizeof__()
Out[32]: 32

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

相比之下,
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)

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

我从
add\n
中期望的行为,即可用输入的总和,实际上是由实现的。这应该是更好的选择,因为它比
add\n
占用更少的内存,但不会像
sum
那样强制求和


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

这不是我的代码。如果你真的感兴趣,这里是回购协议。只需在model.py\u create\u网络函数中更改线路,即可在我的GPU上快速达到OOM异常