【问题标题】:tf.placeholder and Nonetf.placeholder 和 None
【发布时间】:2018-09-21 23:26:10
【问题描述】:

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)

如您所见,上述 None 的具体值可能有所不同。

【问题讨论】:

    标签: python tensorflow


    【解决方案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 提出的错误消息可能更容易理解。这是一种编译时错误,而不是运行时错误。

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

    【讨论】:

    • 谢谢,虽然我不清楚它到底是如何工作的。所以看起来你在说,当所有形状信息都可用时,该图实际上是在运行阶段构建的。要为每次运行处理不同的形状,必须在每次运行时重建图形,这带来了另一个问题。因为每次运行的图表都不同。每次运行也必须有不同的权重集。模型如何处理?
    猜你喜欢
    • 2018-09-20
    • 2016-08-10
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2021-05-13
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多