如何在不必将文本文件中的所有行保存到变量的情况下将它们随机化?

2024-04-16 06:45:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在我创建一个训练国际象棋位置的神经网络的项目中,我从database.lichess.org下载了7000万个游戏,从每一个游戏中提取出每一步的位置,并将赢、输和画的位置保存到不同的文件中

我现在几乎可以开始训练我的神经网络了,但是如果我现在开始训练的话,这些位置将通过游戏聚集在一起——例如,前90个位置(每半步后的45步游戏)将来自同一个游戏。这意味着几乎整个训练迭代都会严重偏向于某场比赛的结果

显而易见的解决方案是将文本文件中的每一行随机化,但我知道的唯一方法是:

import random as rand


def shuffle_lines(textfile_location):
    textfile_lines_list = []

    with open(textfile_location, "r") as textfile:

        for line in textfile.readlines():
            textfile_lines_list.append(line)

    rand.shuffle(textfile_lines_list)
    
    with open(textfile_location, "w") as textfile:
        textfile.truncate()
        
        for line in textfile_lines_list:
            textfile.write(line)

由于我正在洗牌的数据量很大(~70'000'000个游戏*70个半步=~4'900'000'000个位置),我担心这将花费大量时间,因为我首先必须将文本文件中的每个项目复制到列表中,然后洗牌列表,然后将列表复制回文本文件

有没有更有效的方法来实现这一点,例如在不复制到列表的情况下洗牌文本文件


2条回答

(编辑:更新我的答案以反映@Maxijazz的评论)

这里不是洗牌,而是一种更简单的方法(这里n是当前文件中的行数):

使用numpy.random.permutation(n-1)。这将返回一个数组,其中包含整数[0,1…,n-1]的随机排列。您可以简单地按顺序使用这些元素来创建“洗牌”效果

我想提出一种不同的方法:

在神经网络方面,如果你在训练开始时有偏见,通常需要做两件事:

  • 增加批量大小(减少批量中每个游戏的偏差)

  • 降低或改变学习率(开始时重量变化较小)

相关问题 更多 >