如何使用从 TFRecords 读取的值作为 tf.set_shape 的参数?

How can I use values read from TFRecords as arguments to tf.set_shape?

我想做这样的事情:

height = tf.cast(features['height'],tf.int32)
width = tf.cast(features['width'],tf.int32)
image.set_shape(tf.pack([height,width,3]))

但是,我收到以下错误:

TypeError: int() argument must be a string or a number, not 'Tensor'

有人能指出我正确的方向吗?谢谢。

您不能传递 tf.Tensor to Tensor.set_shape()。使用从 TFRecord 读取的值作为 set_shape() 的参数的唯一方法是评估它(例如使用 sess.run())并将生成的 NumPy 数组传递给 set_shape().

此限制的原因有些微妙。 Tensor.set_shape() 用于断言特定 Tensor(即符号值)可以容纳的 所有 值的形状。特别是,当程序员对该数据的了解多于库可以推断的信息时,它用于填补形状推断留下的空白。但是,这些断言只能使用在图形构建时可用的信息。使用特殊值 Dimension(None)(对于未知维度)和 TensorShape(None)(对于未知秩的张量)表示动态变化的形状。

整个 TensorFlow 的意图是大多数操作应该能够在没有静态已知形状的情况下工作,以便可以使用动态变化形状的张量。但是,image processing ops used for cropping/padding:

中有一些例外

这三个操作要求形状是静态已知的。但是,它们只是 tf.pad() and tf.slice() 的便利包装器,利用静态形状避免在每一步中进行不必要的计算。我们一直在慢慢地从图像操作中删除这种依赖性,但请随时提出 GitHub 问题。同时,您可以直接使用较低级别的操作来解决动态张量缺乏形状推断的问题。