【发布时间】:2019-01-05 09:53:51
【问题描述】:
我正在使用 Python Keras 的 fit_generator() 在 30M 行文件(每行是一个样本)上训练深度学习模型,该模型实现了批量训练。由于样本的大小非常不同,出于效率原因,我使用分桶,以避免批次稀疏。
为此,我通过增加行大小对文件进行排序,并编写了一个生成器,它遍历行并在每次处理 n_batch 行时产生一个批处理:
def generate_batches_from_file():
while True:
doc_list = []
with open(path_to_file) as docs:
for my_counter,doc in enumerate(docs):
doc_list.append(doc)
if my_counter % batch_size == 0:
doc_array = truncation_padding_other_stuff(doc_list)
yield(doc_array)
这样,每批中的样本具有相等或非常相似的大小,并且产生的张量是密集的。
但在深度学习中,最佳实践要求批次不是在每个 epoch 都以相同的顺序传递给模型(出于正则化目的)。
如何在我的设置中打乱批次,因为我是动态生成的,而且我必须逐行处理大型排序输入文件以进行分桶? p>
请注意,我不想在每个批次中打乱样本,我希望 批次 在每个时期以不同的顺序传递。
编辑:我最终将每个批次写入磁盘并拥有一个生成器,它在迭代路径列表之前对其进行洗牌。 GitHub 上的最终代码:https://github.com/Tixierae/deep_learning_NLP/blob/master/HAN/preprocessing.py
【问题讨论】:
-
为什么不将大型训练文件分成每个存储桶 1 个文件,然后将这些文件中的行打乱?
-
有趣的问题。您可以将数据拆分为单独的文件,并在每个 epoch 开始时重新排列文件。 tensorflow 数据集 api 还提供了对保存在缓冲区中的数据进行洗牌的可能性:tensorflow.org/api_docs/python/tf/data/Dataset#shuffle
-
是的,我想我会将每个批次写入磁盘,并有一个生成器在遍历路径列表之前对其进行洗牌。
标签: python keras deep-learning bigdata generator