关于csv_reader_dataset的问题

来源:4-5 tf.data读取csv文件并与tf.keras结合使用

zozo_zuo

2019-06-30

老师课程里的csv_reader_dataset的代码

  1. 关于第9行interleave的问题,这里是不是并行读取n_readers个文件,每个文件读取1行(block_length默认等于1),就是说,假设n_readers=2,就读取第1个文件第1行,第2个文件第1行,第1个文件的第2行,第2个文件的第2行,这个顺序读取?所以读入文件时并不是一次性读入一整个文件,而是每次调用map_func(lambda那行)时都需要执行打开文件关闭文件的操作?这样读入数据的顺序就与实际数据在写入csv文件时的顺序并不一致了,是不是由于后面有shuffle,所以这里并不关心数据的读入顺序?
  2. 第8行先对dataset进行repeat,后面才对数据进行shuffle,会不会出现repeat后的数据在shuffle跑到前面去,比如:
    数据[1,2,3,4,5],在repeat后变成[1,2,3,4,5,1,2,3,4,5],shuffle后变成[1,1,2,3,3,4,2,5,5,4],课程后面在训练时每个epoch只执行了11160 // batch_size个step,这里就相当于step执行了5次(假设batch_size=1),那么在训练时就只训练了[1,1,2,3,3]这个几个数据?后面的数据怎么办?是不是缺少训练了?是否可以在第8行的repeat移动到第16行,即:dataset = dataset.repeat().batch(batch_size)?
  3. 数据集dataset是不是相当于generator,通过repeat可以不断的生成数据?
  4. 如何获取dataset的总长度,即样本数量,如果相当于generator是不是就没有长度的概念了?
写回答

1回答

正十七

2019-08-24

同学你好:

  1. 前半部分你理解的是对的,interleave作用就是交错的进行数据的读取。但是并不是每次都打开关闭文件因为这样太耗时了,tf会做缓存把文件内容都读取进来然后再去做交错。然后就是数据应该是相互独立的,所以数据顺序本来就不重要,而不是因为后面有shuffle所以顺序不重要。

  2. repeat的情况下会使得数据从后面跑到前面去。但是因为它是随机化的,所以你说的这样的极端情况应该大概率不存在。当然,按照你的改法应该会更好一些。

  3. 对的,相当于generator

  4. 是的,我们无法从dataset中获取到数据的总长度,只能像generator一样去使用。

0
1
zozo_zuo
非常感谢!
2019-08-24
共1条回复

Google老师亲授 TensorFlow2.0 入门到进阶

Tensorflow2.0实战—以实战促理论的方式学习深度学习

1849 学习 · 896 问题

查看课程