GPU上的tf.reduce_sum与占位符组合作为输入形状失败

时间:2018-03-27 18:49:53

标签: python tensorflow gpu

更新: 仍然出现在Tensorflow 1.7.0

更新: 我写了一个合作笔记本,在谷歌的gpu硬件上重现了这个错误:https://drive.google.com/file/d/13V87kSTyyFVMM7NoJNk9QTsCYS7FRbyz/view?usp=sharing

更新: 在对此问题的第一个修订版中错误地指责tf.gather之后,我现在将其缩小为tf.reduce_sum,并将占位符组合为形状:

tf.reduce_sum为大型张量生成零(仅限GPU),其形状取决于占位符。

在向占位符batch_size提供大整数时运行以下代码(在我的情况下大于700000):

import tensorflow as tf
import numpy as np

graph = tf.Graph()
with graph.as_default():
    batch_size = tf.placeholder(tf.int32,shape=[])
    ones_with_placeholder = tf.ones([batch_size,256,4])
    sum_out = tf.reduce_sum(ones_with_placeholder,axis=2)
    min_sum_out = tf.reduce_min(sum_out)

sess = tf.Session(graph=graph)

sum_result,min_sum_result = sess.run([sum_out,min_sum_out],feed_dict={batch_size: 1000000})
print("Min value in sum_out processed on host with numpy:", np.min(sum_result))
print("Min value in sum_out tensor processed in graph with tf:", min_sum_result)

以下显示错误结果:

Min value in sum_out processed on host with numpy: 0.0
Min value in sum_out tensor processed in graph with tf: 0.0

我原以为在轴2上应用reduce_sum应该会导致4.0无处不在!

在CPU上运行此确切代码可以获得正确的结果。对于tf.ones,使用固定形状运行它会在CPU和GPU上产生正确的结果:

ones_with_fixed_shape = tf.ones([1000000,256,4])
sum_out = tf.reduce_sum(ones_with_fixed_shape,axis=2)

GPU上的占位符有什么问题?

1 个答案:

答案 0 :(得分:0)

基本问题是速度/准确性的权衡。即使您的示例看似微不足道,将整个张量初始化为1,也有1.024B条目。请注意,int32可以表示范围内的整数 [-2,147,483,648至2,147,483,647],但没有丧失精确度:

因此,如果我们累积所有条目并执行计算,我们希望看到一些错误。这也解释了为什么较小的矩阵没有出现问题(较小的批量)。