machine-learning - 为什么训练损失在每个 epoch 开始时都会增加?

标签 machine-learning tensorflow tensorflow-datasets

我正在训练线性回归模型。我使用 tf.contrib.data 准备数据集,对其进行洗牌并批量提供:

  dataset = tf.contrib.data.TFRecordDataset(filename)
  dataset = dataset.map(
      _parse_function, num_threads=16, output_buffer_size=100 * batch_size)
  dataset = dataset.repeat(5)
  dataset = dataset.shuffle(buffer_size=100000)
  dataset = dataset.padded_batch(batch_size, padded_shapes=([None], [None]))
  iterator = dataset.make_initializable_iterator()
  x_inputs, y_ = iterator.get_next()

以下是我们的训练损失: training loss

非常奇怪的是,在每个 epoch(迭代=100k)开始时,我们的训练损失都有一个脉冲。如果训练过程继续进行,我们会在接下来的 epoch 开始时看到相同的模式。

最佳答案

假设您的数据集的记录少于 100000 条,问题可能是输入随机性不足。直观地说,如果现有数据没有被打乱并且按顺序具有某种结构,则训练过程可能会过度拟合文件末尾的记录,并且当您从头开始时,模型将不会在记录上表现良好靠近文件开头,损失会增加。

正确的解决方案取决于数据集的精确详细信息,但以下某些方法可能有用:

  1. 如果可能,请将传递给 Dataset.shuffle()buffer_size 增加到与数据集一样大。 (如果内存无法容纳整个数据集,这可能是不可能的。)

  2. 在训练前随机化输入文件的顺序,确保数据在记录排序中不具有任何结构。

  3. 除了随机化文件内的顺序之外,您还可以将数据分区到多个不同的文件中,并使用以下方法随机化您访问这些文件的顺序:

    dataset = tf.data.Dataset.list_files(shard_filenames)
    dataset = dataset.shuffle(len(shard_filenames))
    dataset = dataset.flat_map(lambda filename: tf.data.TFRecordDataset(filename))
    # ...
    
  4. 作为 (3) 的扩展,您可以使用 Dataset.interleave() 代替 Dataset.flat_map() 一次读取多个分片.

关于machine-learning - 为什么训练损失在每个 epoch 开始时都会增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46928328/

相关文章:

algorithm - 以数字方式表示具有与哈希码不同属性的字符串

r - 为什么 XGB 模型没有在验证数据集上提供输出,但更适合训练

python - Tensorflow 上的多元回归

tensorflow - 如何使tf.data.Dataset在一次调用中返回所有元素?

r - 插入符号 : combine the stratified createMultiFolds (repeatedCV) and groupKFold

machine-learning - 每个样本都有独特的真/假损失

python - Keras 中的自定义加权损失函数,用于对每个元素进行加权

json - TensorflowJS : Failed to parse model. json

tensorflow - 更改batch(),shuffle()和repeat()的顺序时输出差异

python - 在 2.0 session 中迭代 tf.data.Dataset 的正确方法