深度学习——大规模图像分类经验

参考博客

大规模图像分类(MXNet教程中文翻译版)

笔记:故障排除指南

验证集准确率

实现合理的验证准确率通常非常简单,但是要达到最新的论文中的结果有时却会非常困难。为了实现这个目标,你可以尝试下面列出的几点建议。

  • 使用数据增广常常可以减少训练准确率和验证准确率之间的差别。当接近训练末期的时候,数据增广应该减少一些。
  • 训练开始的时候使用较大的学习率,并保持较长一段时间。例如说,在CIFAR10上进行训练时,你可以在前200轮都使用0.1的学习率,然后将其减少为0.01。
  • 不要使用太大的批次,尤其是批次大小远远超过了类别的数目。

速度

  • 分布式训练在大大提高训练速度的同时,每个批次的计算成本也都很高。因此,请确保你的工作量不是很小(诸如在MNIST数据集上训练LeNet),请确保批次的大小在合理的范围内较大。
  • 请确保数据读取和预处理不是瓶颈。将--test-io选项设置为1来检查每秒钟工作集群可以处理多少张图片。
  • 通过设置--data-nthreads来增加数据处理的线程数(默认为4).
  • 数据预处理是通过opencv实现的。如果你所使用的opencv编译自源码,请确保它能够正确工作。
  • 通过设置--benchmark为1来随机的生成数据,和使用真实的有序数据相比,能够缩小一部分瓶颈。
  • 本页中你可以获取到更多相关信息。

显存

如果批次过大,就会超出GPU的容量。当发生这种情况是,你可以看到类似于“cudaMalloc failed: out of memory”的报错信息。有几种方式可以解决这一问题。

  • 减小批次的大小。
  • 将环境变量MXNET_BACKWARD_DO_MIRROR设置为1,它可以通过牺牲速度来减少显存的消耗。例如,在训练批次大小为64时,inception-v3会用掉10G的显存,在K80 GPU上每秒钟大约可以训练30张图片。当启用镜像后,使用10G的显存训练inception-v3时我们可以使用128的批次大小,但代价时每秒钟能够处理的图片数下降为约27张每秒。

猜你喜欢

转载自blog.csdn.net/s000da/article/details/89486004
今日推荐