Python 使用TensorFlow从检查点重新启动培训后保留培训/验证拆分
我已经编写了一个TensorFlow训练循环,在每个历元结束时进行验证。在培训开始时,我将数据集划分为培训和验证子集(大约85%-15%的划分)。我的数据集实际上由存储在磁盘上的小块音频样本组成,在分割之前,我随机洗牌整个数据集,因此在训练和验证子集上得到完全均匀的分布。问题是,如果我从给定的检查点重新开始训练,随机洗牌会再次发生,我怀疑这可能会导致数据污染-验证阶段可能会处理网络已经训练过的数据集的位。我认为这会影响复训后的损失和训练的准确性,但这很难说 我在网上找不到关于这个特定问题的任何信息,但我建议的解决方案是将验证拆分中的文件名缓存到一个文件中,如果重新启动,则从那里加载它们。有更好的解决办法吗Python 使用TensorFlow从检查点重新启动培训后保留培训/验证拆分,python,tensorflow,machine-learning,Python,Tensorflow,Machine Learning,我已经编写了一个TensorFlow训练循环,在每个历元结束时进行验证。在培训开始时,我将数据集划分为培训和验证子集(大约85%-15%的划分)。我的数据集实际上由存储在磁盘上的小块音频样本组成,在分割之前,我随机洗牌整个数据集,因此在训练和验证子集上得到完全均匀的分布。问题是,如果我从给定的检查点重新开始训练,随机洗牌会再次发生,我怀疑这可能会导致数据污染-验证阶段可能会处理网络已经训练过的数据集的位。我认为这会影响复训后的损失和训练的准确性,但这很难说 我在网上找不到关于这个特定问题的任何信
为清楚起见,我使用tf.data.Dataset API,通过一个简单的数据集管道构建训练和验证数据集,该管道从磁盘上的文件读取样本开始。如果设置洗牌种子,顺序将是一致的:
import tensorflow as tf
for _ in range(5):
ds = tf.data.Dataset.range(1, 10).shuffle(4, seed=42).batch(3)
for i in ds:
print(i)
print()
因此,您所需要的只是每次按相同顺序排列的文件列表,您可以使用tf.data.Dataset.list_files
,并设置shuffle=False
:
ds = tf.data.Dataset.list_files(r'C:\Users\User\Downloads\*', shuffle=False)
如果设置洗牌种子,顺序将保持一致:
import tensorflow as tf
for _ in range(5):
ds = tf.data.Dataset.range(1, 10).shuffle(4, seed=42).batch(3)
for i in ds:
print(i)
print()
因此,您所需要的只是每次按相同顺序排列的文件列表,您可以使用tf.data.Dataset.list_files
,并设置shuffle=False
:
ds = tf.data.Dataset.list_files(r'C:\Users\User\Downloads\*', shuffle=False)
@Chris Thsnks-我不使用预打包的数据集,我只是使用tf.data数据集API。但我想我提出的解决方案与此相当,因为它似乎保证了一致性。照目前的情况,问题需要详细信息和清晰性-您刚才提供的详细信息应该已经在问题中了。@Chris Thsnks-我不使用预打包的数据集,我不使用tf.data数据集API。但我想我提出的解决方案与此相当,因为它似乎保证了一致性。因为问题需要细节和清晰性——你刚才提供的细节应该已经在问题中了。