无法将tf.data.Dataset对象转换为numpy迭代器

时间:2020-02-16 15:27:09

标签: python tensorflow tensorflow-datasets

我正在使用Tensorflow 1.14.0和tensorflow_datasets 1.2.0

尝试运行以下代码时

import tensorflow as tf
import tensorflow_datasets as tfds

smallnorb = tfds.load("smallnorb")
smallnorb_train, smallnorb_test = smallnorb["train"], smallnorb["test"]
assert isinstance(smallnorb_train, tf.data.Dataset)
smallnorb_train = smallnorb_train.as_numpy_iterator()

我收到以下错误

AttributeError: 'DatasetV1Adapter' object has no attribute 'as_numpy_iterator'

根据tensorflow_datasets docs,这应该可以工作。

为什么不呢?为什么我首先要获得一个DatasetV1Adapter对象?

2 个答案:

答案 0 :(得分:1)

您使用了错误的tensorflowtensorflow_datasets版本。

除非出于某些特殊原因需要2.x,否则请使用1.x

如果您使用tensorflow 2.1.0tensorflow_datasets 2.0.0,则此代码有效。在here中可以找到1.xtf.data.Dataset的正确文档,并且确实没有这种方法。

答案 1 :(得分:1)

如@szymon所述,tensorflow-1.14不支持as_numpy_iterator。您应该将代码移至tf>=2.0

一个我经常使用的方便技巧是在一个bash shell中启动REPL python shell,并使用dir(tf.data.Dataset)列出可以从该对象调用的所有属性和方法。您可以进一步使用help(tf.data.Dataset.xxx)作为该方法的参数和返回值。

>>> import tensorflow as tf
>>> dir(tf.data.Dataset) 
... <output>

>>> help(tf.data.Dataset.from_tensor_slices)
... and so on

如果执行相同的操作,则会发现as_numpy_iterator列表输出中不会出现dir(tf.data.Dataset),因此会出现错误。