【问题标题】:Combining flat_map and zip when reading TensorFlow Dataset from multiple files: Are files being read from disk a second time?从多个文件中读取 TensorFlow Dataset 时结合 flat_map 和 zip:是否第二次从磁盘读取文件?
【发布时间】: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


    【解决方案1】:

    我仍然认为这很令人困惑,因为我不希望 zip 会导致文件被第二次读取。

    但是,就我而言,事实证明,我需要做的只是将 shuffle=False 参数添加到 tf.data.Dataset.list_files 以始终如一地实现选项 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多