图像分类算法_图像分类算法优化技巧:Bag of Tricks for Image Classification
論文復現對很多人而言難度都比較大,因為常常涉及很多細節,部分細節對于模型效果影響很大,但是卻很少有文章介紹這些細節,前段時間正好看到這篇文章,再加上之前就有關注GluonCV,因此就抽空看了下這篇文章。這篇文章是亞馬遜科學家介紹CNN網絡調優的細節,許多實驗是在圖像分類算法做的,比如ResNet,作者不僅復現出原論文的結果,在許多網絡結構上甚至超出原論文的效果,而且對于目標檢測、圖像分割算法同樣有提升作用。
目前這些復現結果都可以在GluonCV中找到:
https://github.com/dmlc/gluon-cv, GluonCV是亞馬遜推出的深度學習庫,除了提供許多圖像任務的論文復現結果,還提供了非常多常用的數據讀取、模型構建的接口,大大降低了入門深度學習的門檻。因此這篇文章可以看作是一群經驗豐富的工程師介紹煉丹技巧,幫助廣大讀者煉出更好的丹藥,個人感覺非常實用。
首先可以先來看看作者訓練的ResNet50網絡的效果。在Table1中對比了目前幾個常用分類網絡的效果,最后一行是作者通過添加各種訓練技巧后復現的ResNet-50效果,和原論文的結果對比提升非常明顯(top-1準確率從75.3提升到79.29)。
既然要做對比實驗,那么首先要有一個baseline,這個baseline就是作者復現相關算法的結果,這個baseline的復現細節可以參考論文2.1節內容,包括數據預處理的方式和順序、網絡層參數初始化方式、迭代次數、學習率變化策略等,這里不再贅述。Table2是作者采用baseline方式復現的3個常用分類網絡的結果,可以看出來效果基本上和原論文差不多,這里的baseline也將作為后續實驗的對比對象。
介紹完baseline后,接下來就是這篇論文的重點:怎么優化?整篇論文主要從加快模型訓練、網絡結構優化和訓練調優3個部分分別介紹如何提升模型效果,接下來分別介紹。
一、加快模型訓練部分
這部分主要有2塊內容,一塊是選用更大的batch size,另一塊是采用16位浮點型進行訓練。
選用更大的batch size能夠在整體上加快模型的訓練,但是一般而言如果只增大batch size,效果不會太理想,這部分目前有比較多的研究論文,比如Facebook的這篇:Accurate, Large Minibatch SGD:
Training ImageNet in 1 Hour,作者也總結了主要的幾個解決方案:
1、增大學習率,因為更大的batch size意味著基于每個batch數據計算得到的梯度更加貼近整個數據集(數學上來講就是方差更小),因此當更新方向更加準確后,邁的步子也可以更大了,一般而言將batch size修改為原來的幾倍,那么初始學習率也需要修改為原來的幾倍。
2、用一個小的學習率先訓幾個epoch(warmup),因為網絡的參數是隨機初始化的,假如一開始就采用較大的學習率容易出現數值不穩定,這是使用warmup的原因。等到訓練過程基本穩定了就可以使用原先設定的初始學習率進行訓練了。作者在實現warmup的過程中采用線性增加的策略,舉例而言,假設warmup階段的初始學習率是0,warmup階段共需要訓練m個batch的數據(實現中m個batch共5個epoch),假設訓練階段的初始學習率是L,那么在batch i的學習率就設置為i*L/m。
3、每個殘差塊的最后一個BN層的γ參數初始化為0,我們知道BN層的γ、β參數是用來對標準化后的輸入做線性變換的,也就是γx^+β,一般γ參數都會初始化為1,作者認為初始化為0更有利于模型的訓練。
4、不對bias參數執行weight decay操作,weight decay主要的作用就是通過對網絡層的參數(包括weight和bias)做約束(L2正則化會使得網絡層的參數更加平滑)達到減少模型過擬合的效果。
采用低精度(16位浮點型)訓練是從數值層面來做加速。一般而言現在大部分的深度學習網絡的輸入、網絡參數、網絡輸出都采用32位浮點型,現在隨著GPU的迭代更新(比如V100支持16為浮點型的模型訓練),如果能使用16位浮點型參數進行訓練,就可以大大加快模型的訓練速度,這是作者加速訓練最主要的措施,不過目前來看應該只有V100才能支持這樣的訓練。
那么這二者的優化效果如何?Table3是采用更大的batch size和16位浮點型進行訓練的結果,可以看出和原來的baseline相比訓練速度提升還是比較明顯的,效果上也有一定提升,尤其是MobileNet。
詳細的對比實驗可以參考Table4。
二、優化網絡結構部分
這部分的優化是以ResNet為例的,Figure1是ResNet網絡的結構示意圖,簡單而言是一個input stem結構、4個stage和1個output部分,input stem和每個stage的內容在第二列展示,每個residual block的結構在第三列展示,整體而言這個圖畫得非常清晰了。
關于residual block的改進可以參考Figure2,主要有3點。
1、ResNet-B,改進部分就是將stage中做downsample的residual block的downsample操作從第一個11卷積層換成第二個33卷積層,如果downsample操作放在stride為2的11卷積層,那么就會丟失較多特征信息(默認是縮減為1/4),可以理解為有3/4的特征點都沒有參與計算,而將downsample操作放在33卷積層則能夠減少這種損失,因為即便stride設置為2,但是卷積核尺寸夠大,因此可以覆蓋特征圖上幾乎所有的位置。
2、ResNet-C,改進部分就是將Figure1中input stem部分的77卷積層用3個33卷積層替換。這部分借鑒了Inception v2的思想,主要的考慮是計算量,畢竟大尺寸卷積核帶來的計算量要比小尺寸卷積核多不少,不過讀者如果仔細計算下會發現ResNet-C中3個33卷積層的計算量并不比原來的少,這也是Table5中ResNet-C的FLOPs反而增加的原因。
3、ResNet-D,改進部分是將stage部分做downsample的residual block的支路從stride為2的11卷積層換成stride為1的卷積層,并在前面添加一個池化層用來做downsample。這部分我個人理解是雖然池化層也會丟失信息,但至少是經過選擇(比如這里是均值操作)后再丟失冗余信息,相比stride設置為2的1*1卷積層要好一些。
最終關于網絡結構改進的效果如Table5所示,可以看出在效果提升方面還是比較明顯的。
三、模型訓練調優部分
這部分作者提到了4個調優技巧:
1、學習率衰減策略采用cosine函數,這部分的實驗結果對比可以參考Figure3,其中(a)是cosine decay和step decay的示意圖,step decay是目前比較常用的學習率衰減方式,表示訓練到指定epoch時才衰減學習率。(b)是2種學習率衰減策略在效果上的對比。
2、采用label smoothing,這部分是將原來常用的one-hot類型標簽做軟化,這樣在計算損失值時能夠在一定程度上減少過擬合。從交叉熵損失函數可以看出,只有真實標簽對應的類別概率才會對損失值計算有所幫助,因此label smoothing相當于減少真實標簽的類別概率在計算損失值時的權重,同時增加其他類別的預測概率在最終損失函數中的權重。這樣真實類別概率和其他類別的概率均值之間的gap(倍數)就會下降一些,如下圖所示。
3、知識蒸餾(knowledge distillation),這部分其實是模型加速壓縮領域的一個重要分支,表示用一個效果更好的teacher model訓練student model,使得student model在模型結構不改變的情況下提升效果。作者采用ResNet-152作為teacher model,用ResNet-50作為student model,代碼上通過在ResNet網絡后添加一個蒸餾損失函數實現,這個損失函數用來評價teacher model輸出和student model輸出的差異,因此整體的損失函數原損失函數和蒸餾損失函數的結合:
其中p表示真實標簽,z表示student model的全連接層輸出,r表示teacher model的全連接層輸出,T是超參數,用來平滑softmax函數的輸出。
4、引入mixup,mixup其實也是一種數據增強方式,假如采用mixup訓練方式,那么每次讀取2張輸入圖像,假設用(xi,yi)和(xj,yj)表示,那么通過下面這兩個式子就可以合成得到一張新的圖像(x,y),然后用這張新圖像進行訓練,需要注意的是采用這種方式訓練模型時要訓更多epoch。式子中的λ是一個超參數,用來調節合成的比重,取值范圍是[0,1]。
最終這4個調優技巧的實驗結果對比如Table6所示。
最后作者也證明了在分類算法中的這些優化點在其他圖像任務中同樣有效,比如目標檢測任務,如Table8所示,可以看出在ImageNet數據集上表現最好的圖像分類算法同樣在VOC數據集上有最后的表現。
另外在語義分割任務上也有類似的遷移效果,如Table9所示。
整體而言,這篇論文提供了模型優化方面的煉丹秘訣,采用作者復現的這些模型遷移到個人數據集上也能看到明顯的效果提升,真的是非常實用。
本文版權歸《極市平臺》
總結
以上是生活随笔為你收集整理的图像分类算法_图像分类算法优化技巧:Bag of Tricks for Image Classification的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长安汽车贷款购车在哪个金融平台
- 下一篇: uml 工具_【推荐】灵活而丰富UML建