TF2.0中如何用for循环迭代Dataset(替代已弃用的make_initializable_iterator)
解决
make_initializable_iterator()弃用后用for循环迭代TF Dataset的问题 我来帮你搞定这个问题——你遇到的"Resource does not exist"错误,本质是因为在TensorFlow 1.x的tf.compat.v1.Session上下文里,直接用TF 2.x风格的for循环迭代Dataset时,迭代器资源没有被正确初始化并绑定到Session。下面分两种场景给出解决方案:
方案1:优先迁移到TF 2.x的Eager Execution风格(推荐)
TensorFlow 2.x默认启用Eager Execution,不需要再依赖Session来运行计算,直接迭代Dataset即可,这也是官方弃用旧迭代器API的推荐方向。你可以完全去掉Session相关代码,改成这样:
# 移除tf.compat.v1.Session相关代码 data_set = tfr_utils.read_dataset_new(self.tf_rcrds_fl_nm) # 直接用for循环迭代Dataset for features, label in data_set: features_keys = features.keys() # 如果需要将tensor转为numpy数组,使用.numpy()方法 features_np = {key: val.numpy() for key, val in features.items()} label_np = label.numpy() # 你的后续业务逻辑 ...
这种写法简洁且符合TF的最新规范,也不会有弃用警告。
方案2:保留tf.compat.v1.Session的兼容写法(仅用于老项目过渡)
如果你的项目还有大量TF 1.x代码,必须保留Session,可以用tf.compat.v1.data.make_one_shot_iterator()替代弃用的make_initializable_iterator(),再配合while循环模拟for循环的行为,同时处理数据集迭代完毕的异常:
with tf.compat.v1.Session() as sess: data_set = tfr_utils.read_dataset_new(self.tf_rcrds_fl_nm) # 创建一次性迭代器(无需手动初始化) iterator = tf.compat.v1.data.make_one_shot_iterator(data_set) next_sample = iterator.get_next() try: while True: # 每次session.run获取下一个样本 features, label = sess.run(next_sample) features_keys = features.keys() # 你的后续业务逻辑 ... except tf.errors.OutOfRangeError: # 捕获异常,表示数据集已迭代完毕 print("数据集迭代完成") pass
为什么sess.run(data_set)无效?
tf.data.Dataset是一个数据集对象,不是可直接通过sess.run()执行的Tensor,它的作用是生成数据迭代器,必须通过迭代器获取具体的样本数据,所以直接run Dataset没有意义。
内容的提问来源于stack exchange,提问作者Nathan Sowatskey
相关产品推荐
相关产品推荐

