约束 TensorFlow 占位符的形状有什么意义?



https://web.archive.org/web/201702180039/https:/https://github.com/github.com/petewarden/petewarden/petewarden/petewarden/petewarden/plebflow_ios/blob/blob/master/master/tensor/tensor/tensorflow/g3doc/g3doc/resources/resources/resources/resources/resources/faq.md/faq.mdd指出:

tf.placeholder() OP允许您定义必须馈送的张量,并且可选地允许您限制其形状。

限制占位符的形状有什么意义?是仅仅是为了清晰,还是有其他优点,例如减少运行时间?

约束tf.placeholder()形状的主要优点是(可能是部分)形状可用于推断从中得出的张量的形状。然后,可以使用Shape推断来检测在创建OP而不是在运行时创建OP的错误。形状推断类似于逐渐键入语言的推断,例如打字稿,如果您提供有关占位符形状(类型)的更多信息(参数),则系统可以使用该信息来改善程序的稳健性。<<<<<<<<<<<<<<<<<<<<<<

例如,如果您有以下程序:

x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
z = tf.matmul(x, y)
# ...
sess.run(z, feed_dict={x: [[1., 2., 3.]], y: [[2.], [3.]]})

...您将从MatMul内核中获得运行时错误。

相比之下,如果您在tf.placeholder()调用中限制了形状,请如下:

x = tf.placeholder(tf.float32, shape=[1, 3])
y = tf.placeholder(tf.float32, shape=[2, 1])
z = tf.matmul(x, y)

...致电tf.matmul()时您会出现错误。

形状推断还可以提高运行时性能。在各种情况下,tf.shape()的结果可以持续折叠,并且将进行其他优化,从而减少必须运行的操作数量。反向代码尤其必须对其参数的形状非常保守,并且其他静态信息可能会导致更简单的图。

最新更新