如何在Eager Execution模式下使用tf.data Datasets?解决迭代报错
在Eager Execution模式下使用tf.data.Datasets的正确方式
嘿,你遇到的这个TypeError: 'BatchDataset' object is not iterable问题,在TensorFlow 1.x的Eager Execution环境里挺常见的——早期版本的Eager还不支持直接对Dataset对象做for循环迭代,得靠迭代器来搞定。
正确的迭代写法(TF 1.x Eager)
你提到尝试了dataset.make_one...,应该是指make_one_shot_iterator()对吧?完整的可运行代码是这样的:
import tensorflow as tf tf.enable_eager_execution() # 构建数据集 dataset = tf.data.Dataset.from_tensor_slices(tf.random_uniform([50, 10])) dataset = dataset.batch(5) # 创建一次性迭代器,循环获取批次数据 iterator = dataset.make_one_shot_iterator() while True: try: batch = iterator.get_next() print(batch) except tf.errors.OutOfRangeError: # 数据集迭代完会抛出这个异常,捕获后退出循环就行 break
为啥原来的代码报错?
在TF 1.x的Eager模式初期,Dataset类还没实现Python的迭代器协议,所以直接写for batch in dataset会触发类型错误。而make_one_shot_iterator()会生成一个适配Eager模式的迭代器,调用get_next()就能直接拿到张量形式的批次数据,直到数据集被遍历完。
额外提一句:TF 2.x里更简单
要是你升级到TensorFlow 2.x,事情就省心多了——Eager Execution默认就是开启的,而且Dataset已经支持直接迭代,你最开始写的代码改个小细节(tf.random_uniform换成tf.random.uniform)就能直接跑:
import tensorflow as tf # TF2.x不用手动开Eager了 dataset = tf.data.Dataset.from_tensor_slices(tf.random.uniform([50, 10])) dataset = dataset.batch(5) for batch in dataset: print(batch)
内容的提问来源于stack exchange,提问作者Kilian Obermeier
相关产品推荐
相关产品推荐

