天天看點

比用Pytorch架構快200倍!0.76秒後,筆記本上的CNN就搞定了MNIST | 開源

博雯 發自 凹非寺

量子位 報道 | 公衆号 QbitAI

在MNIST上進行訓練,可以說是計算機視覺裡的“Hello World”任務了。

而如果使用PyTorch的标準代碼訓練CNN,一般需要3分鐘左右。

但現在,在一台筆記本電腦上就能将時間縮短200多倍。

速度直達0.76秒!

那麼,到底是如何僅在一次epoch的訓練中就達到99%的準确率的呢?

八步提速200倍

這是一台裝有GeForce GTX 1660 Ti GPU的筆記本。

我們需要的還有Python3.x和Pytorch 1.8。

先下載下傳資料集進行訓練,每次運作訓練14個epoch。

這時兩次運作的平均準确率在測試集上為99.185%,平均運作時間為2min 52s ± 38.1ms。

接下來,就是一步一步來減少訓練時間:

比用Pytorch架構快200倍!0.76秒後,筆記本上的CNN就搞定了MNIST | 開源

一、提前停止訓練

在經曆3到5個epoch,測試準确率達到99%時就提前停止訓練。

這時的訓練時間就減少了1/3左右,達到了57.4s±6.85s。

二、縮小網絡規模,采用正則化的技巧來加快收斂速度

具體的,在第一個conv層之後添加一個2x2的最大采樣層(max pool layer),将全連接配接層的參數減少4倍以上。

然後再将2個dropout層删掉一個。

這樣,需要收斂的epoch數就降到了3個以下,訓練時間也減少到30.3s±5.28s。

三、優化資料加載

使用data_loader.save_data(),将整個資料集以之前的處理方式儲存到磁盤的一個pytorch數組中。

也就是不再一次一次地從磁盤上讀取資料,而是将整個資料集一次性加載并儲存到GPU記憶體中。

這時,我們隻需要一次epoch,就能将平均訓練時間下降到7.31s ± 1.36s。

四、增加Batch Size

将Batch Size從64增加到128,平均訓練時間減少到4.66s ± 583ms。

五、提高學習率

使用Superconvergence來代替指數衰減。

在訓練開始時學習率為0,到中期線性地最高值(4.0),再慢慢地降到0。

比用Pytorch架構快200倍!0.76秒後,筆記本上的CNN就搞定了MNIST | 開源

這使得我們的訓練時間下降到3.14s±4.72ms。

六、再次增加Batch Size、縮小縮小網絡規模

重複第二步,将Batch Size增加到256。

重複第四步,去掉剩餘的dropout層,并通過減少卷積層的寬度來進行補償。

最終将平均時間降到1.74s±18.3ms。

七、最後的微調

首先,将最大采樣層移到線性整流函數(ReLU)激活之前。

然後,将卷積核大小從3增加到5.

最後進行超參數調整:

使學習率為0.01(預設為0.001),beta1為0.7(預設為0.9),bata2為0.9(預設為0.999)。

到這時,我們的訓練已經減少到一個epoch,在762ms±24.9ms的時間内達到了99.04%的準确率。

比用Pytorch架構快200倍!0.76秒後,筆記本上的CNN就搞定了MNIST | 開源

“這隻是一個Hello World案例”

對于這最後的結果,有人覺得司空見慣:

優化資料加載時間,縮小模型尺寸,使用ADAM而不是SGD等等,都是常識性的事情。

我想沒有人會真的費心去加速運作MNIST,因為這是機器學習中的“Hello World”,重點隻是像你展示最小的關鍵值,讓你熟悉這個架構——事實上3分鐘也并不長吧。

比用Pytorch架構快200倍!0.76秒後,筆記本上的CNN就搞定了MNIST | 開源

而也有網友覺得,大多數人的工作都不在像是MNIST這樣的超級叢集上。是以他表示:

我所希望的是工作更多地集中在真正最小化訓練時間方面。
比用Pytorch架構快200倍!0.76秒後,筆記本上的CNN就搞定了MNIST | 開源

GitHub:

https://github.com/tuomaso/train_mnist_fast

參考連結:

[1]https://www.reddit.com/r/MachineLearning/comments/p1168k/p_training_cnn_to_99_on_mnist_in_less_than_1/