当前位置: 首页 > 科技观察

比使用Pytorch框架快200倍!0.76秒后,笔记本上的CNN完成了MNIST

时间:2023-03-17 13:55:36 科技观察

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。MNIST上的训练可以说是计算机视觉中的“HelloWorld”任务。如果使用PyTorch的标准代码训练CNN,一般需要3分钟左右。但现在,在一台笔记本电脑上,这个时间可以缩短200多倍。速度快至0.76秒!那么,如何在一次epoch训练中达到99%的准确率呢?八步提速200倍这是一款搭载GeForceGTX1660TiGPU的笔记本。我们还需要Python3.x和Pytorch1.8。先下载数据集进行训练,每次跑训练14个epochs。此时两次运行在测试集上的平均准确率为99.185%,平均运行时间为2min52s±38.1ms。下一步是逐步减少训练时间:1.提前停止训练在3到5个epoch后,当测试准确率达到99%时提前停止训练。此时训练时间减少了约1/3,达到57.4s±6.85s。2.缩小网络规模,使用正则化技术加速收敛。具体来说,在第一个conv层之后增加一个2x2的最大采样层(maxpoollayer),将全连接层的参数减少4倍以上。然后删除两个丢弃层之一。这样,需要收敛的epoch数减少到3个以内,训练时间也减少到30.3s±5.28s。3.优化数据加载使用data_loader.save_data()将整个数据集保存到磁盘上的pytorch数组,方法和之前一样。也就是说,不是一次从磁盘读取数据,而是一次加载整个数据集并将其保存到GPU内存中。此时,我们只需要一个epoch就可以将平均训练时间减少到7.31s±1.36s。4.增加BatchSize将BatchSize从64增加到128,平均训练时间减少到4.66s±583ms。5.提高学习率,使用Superconvergence代替exponentialdecay。学习率在训练开始时为0,中间达到一个线性峰值(4.0),然后慢慢下降到0。这使我们的训练时间减少到3.14s±4.72ms。6.再次增大BatchSize,减小网络尺寸重复第二步,将BatchSize增大到256。重复步骤4去除剩余的dropout层,通过减小卷积层的宽度进行补偿。最后,平均时间减少到1.74s±18.3ms。7.最后的微调首先,在整流线性函数(ReLU)激活之前移动最大采样层。然后,将卷积核大小从3增加到5。最后,调整超参数:让学习率0.01(默认为0.001),beta1为0.7(默认为0.9),bata2为0.9(默认为0.999).到这个时候,我们的训练已经减少到一个epoch,在762ms±24.9ms内达到了99.04%的准确率。“这只是一个HelloWorld案例”对于这个最终结果,有些人觉得老生常谈:优化数据加载时间、减小模型大小、使用ADAM代替SGD等等,都是常识性的东西。我认为没有人会真正费心加速运行MNIST,因为它是机器学习的“HelloWorld”,重点只是向您展示最小的关键值,让您熟悉该框架——3分钟并不是真的那条长长的酒吧。而且有网友觉得大部分人的工作都不在MNIST这样的超级集群上。所以他说:我希望工作能更多地集中在真正减少培训时间上。GitHub:https://github.com/tuomaso/train_mnist_fast