在张量流

时间:2015-12-14 00:20:51

标签: python neural-network binaryfiles tensorflow

我正在使用tensorflow,希望能够训练一个深度CNN为游戏Go做移动预测。我创建的数据集包含100,000个二进制数据文件,其中每个数据文件对应于记录的游戏,并包含大约200个训练样本(游戏中每个移动一个)。我相信在使用SGD时获得良好的混合非常重要。我希望我的批次包含来自不同游戏的样本以及来自游戏不同阶段的样本。因此,例如,简单地从100个文件的开头读取一个样本并且洗牌不是很好的b / c那些100个样本将是每个游戏的第一步。

我已经阅读了有关从文件中提供数据的教程,但我不确定他们提供的库是否能满足我的需求。如果我自己硬编码,我基本上会初始化一堆文件指针到每个文件中的随机位置,然后从随机文件中提取样本,相应地递增文件指针。

所以,我的问题是tensorflow是否提供了这种功能,还是更容易编写自己的代码来创建批次?

2 个答案:

答案 0 :(得分:11)

是的 - 你想要的是两件事的组合。

首先,随机调整您输入数据文件的顺序,方法是使用带有shuffle=True的{​​{3}}读取它们,这些parse_example可以输入您使用的任何输入法(如果您可以将示例放入tf中) 。示例原型格式,易于与string_input_producer一起使用。要非常清楚,您将文件名列表放在read_file中,然后使用其他方法(例如min_after_dequeue等)阅读它们。

其次,您需要以更精细的粒度进行混合。您可以通过将输入示例提供给具有大容量和大值shuffle_batch_join的{​​{3}}节点来实现此目的。一种特别好的方法是使用一个QueueRunner来接收来自多个文件的输入,这样你就可以进行大量的混音。将批量的容量设置得足够大,以便在不耗尽RAM的情况下充分混合。成千上万的例子通常效果很好。

请注意,批处理功能会向QUEUE_RUNNERS集合添加qrc,因此您需要运行tf.train.string_input_producer

答案 1 :(得分:0)

在您的情况下,进行一些预处理并从您拥有的所有文件中创建一个文件不是问题。对于此类型的游戏,历史记录并不重要,位置决定了数据集只能来自position -> next_move的所有内容。

对于更广泛的情况,TF提供了允许您想要的洗牌的一切。有两种类型的洗牌可以用于不同的目的并且可以改变不同的东西:

  • tf.train.string_input_producer shuffle:Boolean。如果为true,则在每个纪元内随机改组字符串。。因此,如果您有一些文件['file1', 'file2', ..., 'filen'],则会从此列表中随机选择一个文件。如果是false,则文件会一个接一个地跟着。
  • tf.train.shuffle_batch 通过随机调整张量来创建批量。因此,您的队列需要batch_size个张量(您需要创建一个tf.train.start_queue_runners的队列)洗他们。