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)
您可以看到,上面的“无”的具体值可能会有所不同。
答案 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的引发的错误消息可能更容易理解。这是一种编译时错误,而不是运行时错误。
旁注:一些潜在的未来图形操作可能需要事先知道确切的形状。 (但我还没有在源头找到一个,但是。)