建议在 tensorflow 2.0 中调试 `tf.data.Dataset` 操作

Jam*_*own 6 python pandas tensorflow tensorflow-datasets tensorflow2.0

df.head()tf 数据集的 Panda 相当于什么?

按照此处的文档我构建了以下玩具示例:

dset = tf.data.Dataset.from_tensor_slices((tf.constant([1.,2.,3.]), tf.constant([4.,4.,4.]), tf.constant([5.,6.,7.])))
print(dset)
Run Code Online (Sandbox Code Playgroud)

产出

<TensorSliceDataset shapes: ((), (), ()), types: (tf.float32, tf.float32, tf.float32)>
Run Code Online (Sandbox Code Playgroud)

我更喜欢找回类似于 tensor 的东西,所以为了获得一些值,我将制作一个迭代器。

<TensorSliceDataset shapes: ((), (), ()), types: (tf.float32, tf.float32, tf.float32)>
Run Code Online (Sandbox Code Playgroud)

产出

dset_iter = dset.__iter__()
print(dset_iter.next())
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。让我们尝试一些窗口...

(<tf.Tensor: id=122, shape=(), dtype=float32, numpy=1.0>,
 <tf.Tensor: id=123, shape=(), dtype=float32, numpy=4.0>,
 <tf.Tensor: id=124, shape=(), dtype=float32, numpy=5.0>)
Run Code Online (Sandbox Code Playgroud)

产出

windowed = dset.window(2)
print(windowed)
Run Code Online (Sandbox Code Playgroud)

好的,再次使用迭代器技巧:

<WindowDataset shapes: (<tensorflow.python.data.ops.dataset_ops.DatasetStructure object at 0x1349b25c0>, <tensorflow.python.data.ops.dataset_ops.DatasetStructure object at 0x1349b27b8>, <tensorflow.python.data.ops.dataset_ops.DatasetStructure object at 0x1349b29b0>), types: (<tensorflow.python.data.ops.dataset_ops.DatasetStructure object at 0x1349b25c0>, <tensorflow.python.data.ops.dataset_ops.DatasetStructure object at 0x1349b27b8>, <tensorflow.python.data.ops.dataset_ops.DatasetStructure object at 0x1349b29b0>)>
Run Code Online (Sandbox Code Playgroud)

产出

windowed_iter = windowed.__iter__()
windowed_iter.next()
Run Code Online (Sandbox Code Playgroud)

什么?AWindowDataset的迭代器返回其他数据集对象的元组
我希望此 WindowDataset 中的第一项是值为 [[1.,4.,5.],[2.,4.,6.]] 的张量。也许这仍然是正确的,但从这个 3 元数据集对我来说并不容易看出。好的。让我们得到他们的迭代器...

(<_VariantDataset shapes: (), types: tf.float32>,
 <_VariantDataset shapes: (), types: tf.float32>,
 <_VariantDataset shapes: (), types: tf.float32>)
Run Code Online (Sandbox Code Playgroud)

产出

vd = windowed_iter.get_next()
vd0, vd1, vd2 = vd[0], vd[1], vd[2]
vd0i, vd1i, vd2i = vd0.__iter__(), vd1.__iter__(), vd2.__iter__()
print(vd0i.next(), vd1i.next(), vd2i.next())
Run Code Online (Sandbox Code Playgroud)

如您所见,此工作流程很快变得一团糟。我喜欢 Tf2.0 尝试使框架更具交互性和 Pythonic 的方式。是否也有符合这一愿景的数据集 api 的好例子?

azm*_*ath 0

我也遇到过类似的情况。我最终使用了zip

train_dataset = train_dataset.window(10, shift=5)
for step_dataset in train_dataset:
    for (images, labels, paths) in zip(*step_dataset):
        train_step(images, labels)
Run Code Online (Sandbox Code Playgroud)