更新: 仍然出现在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上的占位符有什么问题?
答案 0 :(得分:0)
基本问题是速度/准确性的权衡。即使您的示例看似微不足道,将整个张量初始化为1,也有1.024B条目。请注意,int32可以表示范围内的整数 [-2,147,483,648至2,147,483,647],但没有丧失精确度:
因此,如果我们累积所有条目并执行计算,我们希望看到一些错误。这也解释了为什么较小的矩阵没有出现问题(较小的批量)。