tf.placeholder和None

时间:2018-04-11 23:36:39

标签: python tensorflow

Tensorflow如何在tf.placeholder形状中处理None?是否为每次运行创建了具有不同大小输入的新图形?结果是训练/测试会有任何性能损失吗?

x = tf.placeholder(tf.float32, shape=[None, None, None, None])

lten = list of various shapes of rank 4 tensors. 
for ten in lten:
   feed_dict = {x: ten }
   y = sess.run(y, feed_dict= feed_dict)

您可以看到,上面的“无”的具体值可能会有所不同。

1 个答案:

答案 0 :(得分:1)

<强>背景 在图形构建阶段,TensorFlow在给定输入形状的整个图形中传播形状信息。 code therefore looks like

.SetShapeFn([](shape_inference::InferenceContext* c) {
      c->set_output(0, c->input(0)); // output-shape <- input-shape
      return Status::OK();
    });

因此每个图形操作都可以推断出其输出形状。虽然,有些操作系统不知道它们的输出形状:

.SetShapeFn(tensorflow::shape_inference::UnknownShape);

这与您的占位符相似。没关系。

<强>答案: 并且没有性能损失,因为在each and every compute call期间提取了维度:

// Set all the elements of the output tensor to 0
const int N = input.size();  // EXTRACTED EVERYTIME WHEN CALLED
for (int i = 0; i < N; i++) {
  output(i) = 0;
}

所以只有一个图。

仍然,在占位符中提供形状信息对您自己有帮助,应尽可能将其视为最佳做法。他们可以确保您的图表是正确的。考虑以两种不同的方式使用操作的输出,这两种方式是矛盾的,例如,相同的密集层应用于两种不同的图像尺寸。 您将在构建图表期间直接注意到此问题。此外,来自TensorFlow的引发的错误消息可能更容易理解。这是一种编译时错误,而不是运行时错误。

旁注:一些潜在的未来图形操作可能需要事先知道确切的形状。 (但我还没有在源头找到一个,但是。)