Python 如何控制使用tfrecords和steps\u per\u历元读取哪些样本
我目前正在将我的tf代码转换为tfrecords和tf数据集。在我的应用程序中,经过训练的模型通常在看到所有训练样本之前很久就收敛了。因此,我通常将数据生成器长度设置为我希望在一个历元中适合的批数,并在生成器中确保在下一个历元中,生成器在上一历元的最后一个样本之后拾取。这使得所有回调都能按需要工作(特别是提前停止),同时我仍然可以在每个历元中使用看不见的数据来训练我的模型 如何使用tf数据集和tfrecords实现这种行为?我已经阅读了tensorflow Github上的数据集定义,但不确定这是否可行 如果我设置每个历元的步骤,我认为有两种可能的解决方案:Python 如何控制使用tfrecords和steps\u per\u历元读取哪些样本,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,我目前正在将我的tf代码转换为tfrecords和tf数据集。在我的应用程序中,经过训练的模型通常在看到所有训练样本之前很久就收敛了。因此,我通常将数据生成器长度设置为我希望在一个历元中适合的批数,并在生成器中确保在下一个历元中,生成器在上一历元的最后一个样本之后拾取。这使得所有回调都能按需要工作(特别是提前停止),同时我仍然可以在每个历元中使用看不见的数据来训练我的模型 如何使用tf数据集和tfrecords实现这种行为?我已经阅读了tensorflow Github上的数据集定义,但不确定这
现在我可以使用一种不雅观的方法,我总是训练一个历元,然后用新的tfrecord文件初始化一个新的数据集,但我希望有更好的方法,特别是在回调方面 我不确定我是否完全理解你想要实现的目标。你想要的是:
- 在一个纪元期间,您的模型看不到整个数据集
- 以下历代不使用以前历代的样本
steps\u per\u epoch
参数是最好的选择。例如,如果您有一个包含100个项目(样本或批次)的数据集,并且您设置了steps\u per\u epoch=20
,那么在第一个epoch期间,您的模型将看到项目0到19,在第二个epoch期间看到项目20到39,依此类推。不需要覆盖代码的任何部分
试图模仿数据集的行为可能不是一个好主意(需要处理的事情太多,涉及的工作太多)
从您的最后一段中,我了解到您希望向每个历元提供来自特定TFRecord文件的数据。也许你可以看看。建立TFRecord文件列表(同一文件可以多次出现)和“flat\u map
”TFRecordDataset
:
files=tf.data.Dataset.from\u tensor\u切片([
“file1.tfrecord”、“file2.tfrecord”,
“file1.tfrecord”、“file3.tfrecord”
])
dataset=file.flat\u映射(TFRecordDataset)
在数据集上迭代将得到文件1、文件2、文件1和文件3中的示例
希望这能有所帮助。我不确定我是否完全理解您试图实现的目标。你想要的是:
- 在一个纪元期间,您的模型看不到整个数据集
- 以下历代不使用以前历代的样本
就这样
在我看来,steps\u per\u epoch
参数是最好的选择。例如,如果您有一个包含100个项目(样本或批次)的数据集,并且您设置了steps\u per\u epoch=20
,那么在第一个epoch期间,您的模型将看到项目0到19,在第二个epoch期间看到项目20到39,依此类推。不需要覆盖代码的任何部分
试图模仿数据集的行为可能不是一个好主意(需要处理的事情太多,涉及的工作太多)
从您的最后一段中,我了解到您希望向每个历元提供来自特定TFRecord文件的数据。也许你可以看看。建立TFRecord文件列表(同一文件可以多次出现)和“flat\u map
”TFRecordDataset
:
files=tf.data.Dataset.from\u tensor\u切片([
“file1.tfrecord”、“file2.tfrecord”,
“file1.tfrecord”、“file3.tfrecord”
])
dataset=file.flat\u映射(TFRecordDataset)
在数据集上迭代将得到文件1、文件2、文件1和文件3中的示例
希望这能有所帮助。你好,亚历克西斯,谢谢你的回复!所以这听起来像是我想要的默认行为。如果我理解正确,如果我设置了每个历元的步数
,数据集在“用完”新示例之前仍将遍历所有数据?有没有办法验证这一点?我担心并行化会同时读取多个tfrecord
文件,如果纪元结束,会随机选择新文件,并且“文件中更深的”样本永远不会被读取。但这可能是我对并行化如何工作的误解。从我的实验来看,默认行为是你想要的。为了验证它,您可以尝试在调用方法中使用tf.print
构建一个非常简单的单层模型。然后运行model.fit(数据集,每个历元的步数=n,详细度=2)
。关于并行性,这取决于如何构建数据集。默认情况下,使用TFRecordDataset
时没有并行性(请参见num\u parallel\u reads
参数),并且flat\u map
也按顺序运行(与interleave
方法相比)。您好,是,我可以大致验证这是否确实是所需的行为-在打印每个标签只有一次的数据集时,我找不到重复项,并且由于数据集结束而引发错误之前的样本数与我预期的数目匹配。谢谢你的澄清!你好,亚历克西斯,谢谢你的回复!所以这听起来像是我想要的默认行为。如果我理解正确,如果我按照epo设置步骤