首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么训练损失在每个时代开始时都会增加?

为什么训练损失在每个时代开始时都会增加?
EN

Stack Overflow用户
提问于 2017-10-25 17:08:27
回答 2查看 3.7K关注 0票数 8

我正在训练一个线性回归模型。我使用tf.contrib.data来准备数据集,对其进行混洗,然后分批提供:

代码语言:javascript
运行
复制
  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()

以下是我们的训练损失:

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

EN

回答 2

Stack Overflow用户

发布于 2017-12-05 06:12:59

假设您的数据集具有少于100000条记录,则问题可能是输入混洗中的随机性不足。直观地说,如果现有数据没有被打乱,并且它们的顺序具有某种结构,那么训练过程可能会过度适应文件末尾的记录,并且当您在开始处重新启动时,模型将不会在文件开头附近的记录上表现良好,并且损失将会增加。

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

  1. 如果可能,请将传递给Dataset.shuffle()buffer_size增加到与数据集一样大。(如果您的整个数据集不适合在训练前通过随机化输入文件的顺序来使数据在记录的顺序中没有任何结构,则这可能是不可能的。
  2. 除了随机化文件中的顺序外,您还可以将数据划分为几个不同的文件,并使用以下方法随机化访问这些文件的顺序:

dataset = tf.data.Dataset.list_files(shard_filenames) dataset = dataset.shuffle(len(shard_filenames)) dataset =dataset.flat_map(λ文件名:tf.data.TFRecordDataset(文件名))#...

  • 作为(3)的扩展,您可以使用Dataset.interleave()代替Dataset.flat_map()一次读取多个分片。
票数 3
EN

Stack Overflow用户

发布于 2018-12-19 21:48:02

这里可以看到相同的锯齿模式:https://discuss.pytorch.org/t/strange-behavior-with-sgd-momentum-training/7442

建议的解决方案是确保您的数据加载器使用替换加载数据。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46928328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档