2016-07-08 116 views
8

我一直在使用单GPU(GeForce GTX 980 Ti,6GB)的适度机器上训练Inception V3。最大批量大小看起来大约为40在适度的硬件设置上训练Tensorflow Inception-v3 Imagenet

我已使用inception_train.py文件中指定的默认学习率设置:initial_learning_rate = 0.1num_epochs_per_decay = 30learning_rate_decay_factor = 0.16。一对夫妇的训练精度最好我能做到的,是如下(约500K-1M迭代)周后:

2016-06-06 12:07:52.245005: precision @ 1 = 0.5767 recall @ 5 = 0.8143 [50016 examples] 
2016-06-09 22:35:10.118852: precision @ 1 = 0.5957 recall @ 5 = 0.8294 [50016 examples] 
2016-06-14 15:30:59.532629: precision @ 1 = 0.6112 recall @ 5 = 0.8396 [50016 examples] 
2016-06-20 13:57:14.025797: precision @ 1 = 0.6136 recall @ 5 = 0.8423 [50016 examples] 

我试着朝训练课结束的设置摆弄,但在准确性方面看不到任何改进。

我已经从头开始了一个新的培训课程,其中num_epochs_per_decay = 10和learning_rate_decay_factor = 0.001基于本论坛中的一些其他帖子,但它在这里是黑暗中的一种掌握。

上好的默认值小的硬件设置,像我的任何建议?

回答

16

TL,DR:从适中的硬件设置开始,在可容忍的时间内从头开始培训Inception V3模型的方法尚不存在。我强烈建议对预期的任务重新训练一个预先训练好的模型。

在像您这样设置的小型硬件上,很难实现最佳性能。一般来说,对CNN来说,最好的性能是可能的最大批量。这意味着对于CNN来说,训练过程往往受限于可容纳GPU内存的最大批量。

可供下载 here

先启V3模型的1600有效批量大小被训练在50个GPU的 - 其中每个GPU跑鉴于你谦虚硬件32

批量大小,我的头号建议将就是从上面的链接下载预先训练好的模式,然后重新训练模型以完成您手头的单个任务。这会让你的生活更加快乐。

作为一个思想实验(但几乎没有实际的)..如果你感觉特别被迫正是从无到有,从训练预先训练模型该模型的训练表现匹配,你可以在执行以下操作疯狂程序你的1个GPU。也就是说,你可以运行下面的过程:

从梯度运行
  • 重复这个50倍32
  • 商店的批量大小
    1. 运行。
    2. 平均50批次的梯度。
    3. 用渐变更新所有变量。
    4. 重复

    我只提这给你的需要来完成,以实现完全一样的性能是什么概念的意义。鉴于你提到的速度数字,这个程序需要数月才能运行。非常实用。

    更为现实的,如果你还是从头开始训练了浓厚的兴趣,做你可以在最好的,这里有一些一般准则:

    • 始终以最大的批量大小可能运行。看起来你已经这么做了。大。
    • 确保您没有CPU绑定。也就是说,确保输入处理队列总是显示在TensorBoard上适度充满。否则,增加预处理线程的数量或使用不同的CPU(如果可用)。
    • Re:学习率。如果您始终运行同步训练(如果您只有一个GPU,则必须是这种情况),那么批处理量越大,可接受的学习速率就越高。我会尝试一系列快速运行(例如每个小时)以确定可能的最高学习,而不会导致NaN。找到这样的学习速度后,将其降低5-10%并运行。
    • 至于num_epochs_per_decay和decay_rate,有几种策略。由突出显示的策略每衰减10个时期,0.001衰减因子是尽可能长时间敲击模型,直到eval准确度渐近。然后降低学习率。这是一个很好的简单策略。我会验证这是您在模型监控中看到的eval准确性,并确定它在您允许模型衰减学习率之前确实渐近。最后,衰减因素有点特殊,但通过10的幂降低似乎是一个很好的经验法则。

    再次请注意,这些是一般指导原则,其他人甚至可能会提供不同的建议。我们不能给你更具体的指导的原因是,这种大小的CNN通常不是经常在适度的硬件设置上从头开始训练的。