在适度的硬件设置上训练Tensorflow Inception-v3 Imagenet

Dom*_*iek 10 computer-vision deep-learning tensorflow imagenet

我一直在使用单GPU(GeForce GTX 980 Ti,6GB)的普通机器上训练Inception V3.最大批量大小似乎在附近40.

我用在指定的默认学习速率设置inception_train.py文件:initial_learning_rate = 0.1,num_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]
Run Code Online (Sandbox Code Playgroud)

我已经尝试在训练课程结束时摆弄设置,但是在准确性方面没有看到任何改进.

我已经从头开始了一个新的训练课程,基于这个论坛中的其他一些帖子,num_epochs_per_decay= 10和learning_rate_decay_factor= 0.001,但这里有点在黑暗中抓住.

有关像我这样的小型硬件设置的良好默认值的任何建议吗?

小智 20

TL,DR:没有已知的方法可以从适当的硬件设置中在可容忍的时间内从头开始训练Inception V3模型.我强烈建议在预期的任务上重新训练一个预先训练过的模型.

在像您这样的小型硬件上,很难获得最佳性能.一般来说,对于CNN来说,最好的性能是可能的最大批量.这意味着对于CNN,训练过程通常受限于可以适合GPU内存的最大批量大小.

可在此处下载的Inception V3模型经过50个GPU的有效批量处理1600训练 - 其中每个GPU的批量大小为32.

鉴于您的硬件适中,我的第一个建议是从上面的链接下载预训练模式,并重新训练您手头的单个任务的模型.这会让你的生活更幸福.

作为一个思想实验(但几乎不实用)..如果你觉得特别强迫通过训练从头开始训练模型完全匹配模型的训练性能,你可以在你的1 GPU上做下面的疯狂程序.也就是说,您可以运行以下过程:

  1. 批量大小为32运行
  2. 存储运行中的渐变
  3. 重复这50次.
  4. 平均50个批次的梯度.
  5. 使用渐变更新所有变量.
  6. 重复

我只是提到这一点,让你从概念上了解为达到完全相同的性能需要完成的工作.鉴于您提到的速度数字,此过程将需要数月才能运行.很难实用.

更现实的是,如果您仍然对从头开始训练并尽力做到最好,那么这里有一些一般性指导原则:

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

请再次注意,这些是一般指导原则,其他人甚至可能提供不同的建议.我们无法为您提供更具体的指导的原因是,这种规模的CNN通常不会在适度的硬件设置上从头开始接受培训.