【问题标题】:tf.data.dataset: How do I assign shape to a dataset (with shape undefined) that is guaranteed to output certain shape?tf.data.dataset:如何将形状分配给保证输出特定形状的数据集(形状未定义)?
【发布时间】:2020-03-12 09:52:33
【问题描述】:

我有一个 tf2 数据集 API dataset,它经历了多次 map 操作,然后是 tf.image.resize,不断输出形状 (300, 300),即保证每条记录在所有映射操作之后都具有这种形状。然而,这并不是天生的推断,因此张量规范显示<undefined>, <undefined> 形状。如果将未定义形状的数据集传递给具有预定义输入形状的模型,则会引发错误。

一些搜索帮助我找到了这个函数tf.contrib.data.assert_element_shapeIssue #16052

dataset = dataset.apply(tf.data.experimental.assert_element_shape(custom_shape))

但是这个函数在 tf2 中已经被移除了,文档不推荐使用其他东西来代替 assert_element_shape。 什么是等价物?或者如何将形状分配给保证输出特定形状的数据集?

【问题讨论】:

  • 如果您知道tf.image.resize 之后的输出是(300, 300),您就不能用set_shape() 设置硬编码形状吗?

标签: python tensorflow tensorflow-datasets


【解决方案1】:

如果您将“set_shape”行放在“resize”行之前,则接受的答案中的第一个 sn-p 代码实际上会起作用。

【讨论】:

  • 请添加一个代码 sn-p 来表明你的意思。
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

由于某种原因,在我添加 tf.image.resize 的地图函数中添加 set_shape 不起作用。

# does not work
def my_map_function(image, label):
    # some image operations here
    image = tf.image.resize(image, size=[300, 300])
    image.set_shape((300, 300, 3))
    return image, label

但是当我制作一个单独的地图功能时,它可以工作:

# works
def set_shapes(image, label):
    image.set_shape((300, 300, 3))
    label.set_shape([])
    return image, label

也许我会坚持下去,直到直接的 assert_element_shapeset_element_shape 被添加为单独的函数

【讨论】:

  • 我认为您的意思是为顶级函数定义编写 'def' 而不是 'function'
  • 抱歉打错了,我已经更新了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2014-08-04
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多