【问题标题】:Tensor shape does not make sense to me after using `batch()` on dataset在数据集上使用 `batch()` 后,张量形状对我没有意义
【发布时间】:2018-08-18 01:11:59
【问题描述】:

这是我测试 tf.data.Dataset 的代码:

import tensorflow as tf

# build a random tensor
x=tf.random_uniform([10, 10])
# transform to dataset
dataset = tf.data.Dataset.from_tensors(x)
# batch reading   
dataset = dataset.batch(3)
ite = dataset.make_initializable_iterator()
ele = ite.get_next()

sess=tf.Session()
sess.run(ite.initializer)
ele_ = sess.run(ele)
print ele_.shape

程序输出的形状是[1,10,10] 而不是[3,10,10],这对我来说完全没有意义。

谁能帮忙解释一下?

谢谢!!

【问题讨论】:

    标签: tensorflow dataset


    【解决方案1】:

    根据the docsfrom_tensors 从给定输入创建一个包含单个元素的数据集。也就是说,您正在创建一个包含一个形状为 [10, 10] 的元素的数据集。
    由于您只有一个元素,batch 只能创建一个单元素批次,从而提供一个包含一个形状为 [1, 10, 10] 的元素的新数据集。

    也许您正在寻找tf.data.Dataset.from_tensor_slices?在这种情况下,这将创建一个包含 10 个元素的数据集,每个元素的形状为 [10]。然后,应用 batch(3) 实际上会给你 3 个批次,即形状为 [3, 10] 的元素(除了只有一个元素的剩余批次)。

    【讨论】:

    • 您能否详细说明tf.data.Dataset.from_tensor_slices。我不懂文档,比如Creates a Dataset whose elements are slices of the given tensors。这是否意味着它将创建 10 张量,每个张量的形状为 [10]
    • 如果我们将形状为 [10]10 张量索引为 0,1,2,3...9 并应用 batch(3)。最后,迭代器将为您提供第一个 run() 索引为 0、1、2 的张量,然后为第二个 run() 提供 3、4、5 索引,依此类推。我说的对吗?
    • 是的,它将是第 0,1,2 行,然后是 3,4,5,然后是 6,7,8,然后是 9,所以最后一批会更小。如果您将drop_remainder=True传递给batch,则根本不会返回第9行。
    • 非常有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多