如何让slim.dataset_data_provider.DatasetDataProvider保证读取图片的顺序
TensorFlow Slim DatasetDataProvider 读取顺序固定问题解答
你当前的代码无法保证DatasetDataProvider获取图片的顺序固定,虽然你已经设置了shuffle=False、单读取器、单线程批处理等降低乱序概率的配置,但仍有缺失的固定配置项,具体原因和修复方案如下:
- 核心原因1:未固定TensorFlow全局随机种子和算子级随机种子
TensorFlow的所有涉及状态的操作(包括数据集读取、队列调度等)都会依赖全局随机状态,每次启动新会话时默认随机初始化状态,就算显式关闭shuffle也可能出现读取顺序波动。
修复方式:
- 在代码开头固定全局图随机种子
- 给
DatasetDataProvider、prefetch_queue等涉及队列的算子添加固定随机种子参数
核心原因2:文件列表顺序未固定
如果你的dataset是基于文件列表构造的,需要确保文件列表的读取顺序本身是固定的,不要直接使用未排序的glob返回结果,不同操作系统下glob返回的文件顺序可能不一致,建议先对文件列表做排序再传入dataset构造函数。额外注意:你代码中存在拼写错误,
images, lables = batch_queue.dequeue()里的lables应为labels,该错误不会影响读取顺序,但会导致后续变量取值异常。
修复后可固定读取顺序的代码示例
import tensorflow as tf import tensorflow.contrib.slim as slim # 固定全局随机种子 tf.set_random_seed(42) provider = slim.dataset_data_provider.DatasetDataProvider( dataset, num_readers=1, shuffle=False, seed=42 # 算子级固定种子 ) [image, label] = provider.get(["image", "label"]) images, labels = tf.train.batch( [image, label], batch_size=1, num_threads=1, capacity=1, enqueue_many=False ) batch_queue = slim.prefetch_queue.prefetch_queue( [images, labels], capacity=1, seed=42 # 预取队列固定种子 ) # 修正拼写错误 images, labels = batch_queue.dequeue() sess = tf.Session() # 队列启动操作要放在固定种子的配置之后 tf.train.start_queue_runners(sess=sess) data, label = sess.run([images, labels])
完成上述修改后,每次运行代码读取图片的顺序就会完全固定。
内容的提问来源于stack exchange,提问作者Xiaoquan Li
相关产品推荐
相关产品推荐

