【问题标题】:How can I use values read from TFRecords as arguments to tf.set_shape?如何使用从 TFRecords 读取的值作为 tf.set_shape 的参数?
【发布时间】:2016-03-03 13:44:44
【问题描述】:

我想做这样的事情:

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'

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

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    您不能将tf.Tensor 传递给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()tf.slice() 的便捷包装器,它们利用静态形状来避免在每一步中进行不必要的计算。我们一直在慢慢地从图像操作中删除这种依赖关系,但请随时提出关于此的 GitHub 问题。同时,您可以直接使用较低级别的操作来解决动态张量缺乏形状推断的问题。

    【讨论】:

    • 我们在构建图的时候如何恢复张量的形状呢?众所周知,在 TFRecords 文件中,图像数据被展平,网络必须输入大小为H x W 的图像。现在HW 存储在TFRecords 中,但我们不能使用set_shape()。又怎样? (我认为我们不应该启动一个会话来评估它)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2018-04-17
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多