我编写了一个TensorFlow训练循环,每个epoch结束时进行验证。在训练开始时,我将数据集分为训练和验证子集(约85%-15%的分割)。我的数据集实际上由存储在磁盘上的小块音频样本组成,并且我在分割前随机打乱整个数据集,因此在训练和验证子集中得到完全均匀的分布。问题是,如果我从给定的检查点重新开始训练,随机打乱会再次发生,我怀疑这可能导致数据污染——验证阶段可能会处理网络已经训练过的数据集部分。我认为我看到这在重新开始后的训练损失和准确率上产生了影响,但很难确定。
我在网上找不到关于这个特定问题的任何信息,但我提出的解决方案是将验证分割中的文件名缓存到文件中,如果重新开始则从那里加载它们。有没有更好的解决方案?
为清楚起见,我使用的是tf.data.Dataset API,通过从磁盘上的文件读取样本来构建训练和验证数据集的简单数据集管道。
回答:
如果你设置了打乱的种子,顺序将保持一致:
import tensorflow as tffor _ in range(5): ds = tf.data.Dataset.range(1, 10).shuffle(4, seed=42).batch(3) for i in ds: print(i) print()
tf.Tensor([4 1 2], shape=(3,), dtype=int64)tf.Tensor([7 3 6], shape=(3,), dtype=int64)tf.Tensor([5 9 8], shape=(3,), dtype=int64)tf.Tensor([4 1 2], shape=(3,), dtype=int64)tf.Tensor([7 3 6], shape=(3,), dtype=int64)tf.Tensor([5 9 8], shape=(3,), dtype=int64)tf.Tensor([4 1 2], shape=(3,), dtype=int64)tf.Tensor([7 3 6], shape=(3,), dtype=int64)tf.Tensor([5 9 8], shape=(3,), dtype=int64)tf.Tensor([4 1 2], shape=(3,), dtype=int64)tf.Tensor([7 3 6], shape=(3,), dtype=int64)tf.Tensor([5 9 8], shape=(3,), dtype=int64)tf.Tensor([4 1 2], shape=(3,), dtype=int64)tf.Tensor([7 3 6], shape=(3,), dtype=int64)tf.Tensor([5 9 8], shape=(3,), dtype=int64)
所以,你所需要的只是每次都以相同顺序的文件列表,你可以使用tf.data.Dataset.list_files
来实现,并设置shuffle=False
:
ds = tf.data.Dataset.list_files(r'C:\Users\User\Downloads\*', shuffle=False)