Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何控制使用tfrecords和steps\u per\u历元读取哪些样本_Python_Tensorflow_Tensorflow Datasets - Fatal编程技术网

Python 如何控制使用tfrecords和steps\u per\u历元读取哪些样本

Python 如何控制使用tfrecords和steps\u per\u历元读取哪些样本,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,我目前正在将我的tf代码转换为tfrecords和tf数据集。在我的应用程序中,经过训练的模型通常在看到所有训练样本之前很久就收敛了。因此,我通常将数据生成器长度设置为我希望在一个历元中适合的批数,并在生成器中确保在下一个历元中,生成器在上一历元的最后一个样本之后拾取。这使得所有回调都能按需要工作(特别是提前停止),同时我仍然可以在每个历元中使用看不见的数据来训练我的模型 如何使用tf数据集和tfrecords实现这种行为?我已经阅读了tensorflow Github上的数据集定义,但不确定这

我目前正在将我的tf代码转换为tfrecords和tf数据集。在我的应用程序中,经过训练的模型通常在看到所有训练样本之前很久就收敛了。因此,我通常将数据生成器长度设置为我希望在一个历元中适合的批数,并在生成器中确保在下一个历元中,生成器在上一历元的最后一个样本之后拾取。这使得所有回调都能按需要工作(特别是提前停止),同时我仍然可以在每个历元中使用看不见的数据来训练我的模型

如何使用tf数据集和tfrecords实现这种行为?我已经阅读了tensorflow Github上的数据集定义,但不确定这是否可行

如果我设置每个历元的步骤,我认为有两种可能的解决方案:

  • 重写代码中指定从何处读取下一个样本的部分,以仅在上一个历元的最后一个样本之后拾取该样本
  • 试图通过自定义tf数据集实现模仿上述行为。我担心这可能会对并行性和性能产生不可预见的影响
  • 然而,我也不知道如何做到这一点。因此,如果您对此有任何见解,我将非常感激


    现在我可以使用一种不雅观的方法,我总是训练一个历元,然后用新的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设置
    步骤