【发布时间】:2019-01-19 02:35:56
【问题描述】:
跟进a previous question,我正在使用tf.data.Dataset.zip(dataset, dataset.skip(1)) 生成连续项目的数据集。我这样做是因为我希望我的 model_fn 一次输入两个连续的帧,以便计算差异。
从磁盘上的多个tfrecords 文件中读取时,我遇到了一个问题,即我的数据集中记录的正确顺序有时在我当前的实现中没有得到维护。简化后的问题可以重现为:
file1.txt(file2.txt 与 f2_i01,1 等看起来相同)
f1_i01,1
f1_i02,2
f1_i03,3
f1_i04,4
f1_i05,5
我的代码
import tensorflow as tf
COLUMNS = ['image', 'label']
FIELD_DEFAULTS = [['empty'], [0]]
def _line_parser(line):
fields = tf.decode_csv(line, FIELD_DEFAULTS)
data = dict(zip(COLUMNS, fields))
label = data.pop('label')
return data, label
filenames = ['file1.txt', 'file2.txt']
files = tf.data.Dataset.list_files(filenames)
dataset = files.flat_map(
lambda filename:
tf.data.TextLineDataset(filename)
.map(_line_parser))
dataset = tf.data.Dataset.zip((dataset, dataset.skip(1)))
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()
init_op = iterator.initializer
with tf.Session() as sess:
sess.run(init_op)
for i in range(5):
print(sess.run(next_element))
如果我执行这段代码,我会得到一个以下结果,似乎是随机的:
选项 1.1:保持顺序(首先读取 file1.txt)
(({'image': b'f1_i01'}, 1), ({'image': b'f1_i02'}, 2))
(({'image': b'f1_i02'}, 2), ({'image': b'f1_i03'}, 3))
(({'image': b'f1_i03'}, 3), ({'image': b'f1_i04'}, 4))
(({'image': b'f1_i04'}, 4), ({'image': b'f1_i05'}, 5))
(({'image': b'f1_i05'}, 5), ({'image': b'f2_i01'}, 1))
选项 1.2:维护顺序(首先读取 file2.txt)
(({'image': b'f2_i01'}, 1), ({'image': b'f2_i02'}, 2))
(({'image': b'f2_i02'}, 2), ({'image': b'f2_i03'}, 3))
(({'image': b'f2_i03'}, 3), ({'image': b'f2_i04'}, 4))
(({'image': b'f2_i04'}, 4), ({'image': b'f2_i05'}, 5))
(({'image': b'f2_i05'}, 5), ({'image': b'f1_i01'}, 1))
选项 2.1:不维护订单(先读取 file1.txt)
(({'image': b'f1_i01'}, 1), ({'image': b'f2_i02'}, 2))
(({'image': b'f1_i02'}, 2), ({'image': b'f2_i03'}, 3))
(({'image': b'f1_i03'}, 3), ({'image': b'f2_i04'}, 4))
(({'image': b'f1_i04'}, 4), ({'image': b'f2_i05'}, 5))
(({'image': b'f1_i05'}, 5), ({'image': b'f1_i01'}, 1))
选项 2.2:不维护订单(先读取 file2.txt)
(({'image': b'f2_i01'}, 1), ({'image': b'f1_i02'}, 2))
(({'image': b'f2_i02'}, 2), ({'image': b'f1_i03'}, 3))
(({'image': b'f2_i03'}, 3), ({'image': b'f1_i04'}, 4))
(({'image': b'f2_i04'}, 4), ({'image': b'f1_i05'}, 5))
(({'image': b'f2_i05'}, 5), ({'image': b'f2_i01'}, 1))
在我看来,zip 函数会导致第二次独立地从磁盘读取数据集。有什么方法可以让我始终如一地实现选项 1?
【问题讨论】:
标签: python tensorflow tensorflow-datasets