pass
来源:4-5 tf.data读取csv文件并与tf.keras结合使用
战战的坚果
2020-02-12
def csv_reader_dataset(filenames, n_readers=5,
batch_size=32, n_parse_threads=5,#做解析时的并行度
shuffle_buffer_size=10000):#混排数据时的buffer的size
dataset = tf.data.Dataset.list_files(filenames)
dataset = dataset.repeat()#数据集重复了指定次数,参数为空:重复无限次
dataset = dataset.interleave(
lambda filename: tf.data.TextLineDataset(filename).skip(1),
cycle_length = n_readers
)
dataset.shuffle(shuffle_buffer_size) #将数据打乱,数值越大,混乱程度越大
dataset = dataset.map(parse_csv_line,
num_parallel_calls=n_parse_threads)
dataset = dataset.batch(batch_size)#batch(4)是把dataset变成四份
return dataset
老师,我对上面这个函数的实现流程不懂:
1。首先将全部文件名变成一个dataset,然后将数据集重复了无限次,是为什么?
2. 数据集重复后,调用interleave函数,获取每个文件名对应的文本内容即dataset,最后合并生成新的dataset,调用shuffle(shuffle_buffer_size) #将数据打乱,括号里数值越大,混乱程度越大,为什么要将已经重复了无限次的数据集进行混排?
3. map函数解析,将数据集按照batch_size分块。以上是我对这个函数的理解。
最后,老师,repeat()和shuffle()和batch()这三个函数的执行顺序不同是否影响结果,有什么影响?它们的执行顺序是怎么决定的?
为什么要重复无限次?为什么要混排?
1回答
-
先说为什么重复无限次,和为什么混排。
重复无限次的原因是因为我们可能要遍历数据集很多遍。混排的原因是我们希望数据的顺序不影响训练,因为我们是按照batch进行训练的,如果一些数据经常在同一个batch中出现,那么网络可能会学到同一个batch中不同数据间的联系,这不是我们所需要的。
然后是具体的问题:
1。首先将全部文件名变成一个dataset,然后将数据集重复了无限次,是为什么?
这是因为文件名重复无数次,整个最后的数据集也就会是无限的。
2. 数据集重复后,调用interleave函数,获取每个文件名对应的文本内容即dataset,最后合并生成新的dataset,调用shuffle(shuffle_buffer_size) #将数据打乱,括号里数值越大,混乱程度越大,为什么要将已经重复了无限次的数据集进行混排?
混排的原因上面我们说了。
3. map函数解析,将数据集按照batch_size分块。以上是我对这个函数的理解。
map方法是对上一步的数据集中的每个item做解析。
最后,老师,repeat()和shuffle()和batch()这三个函数的执行顺序不同是否影响结果,有什么影响?
这个一般影响不大,不过对我们这个例子来说,其实是有两种dataset,即文件名dataset,以及文件内容dataset。repeat可以在任意一个上做,但shuffle和batch只能在后一个dataset上做,不然数据就不是我们所需要的。
042020-04-23