最近,HackerEarth舉辦的一項初學者深度學習挑戰賽,落幕了。
比賽内容是,識别野生動物。
來自印度的大學生Abhishek Sharma登上了冠軍寶座。

于是,他寫了寫自己的心得,給小夥伴們參考:
怎樣的挑戰
比賽資料集裡有19,000張圖,包含30個不同物種的野生動物。
△ 來自比賽資料集
動物的照片是在真實場景裡拍攝的,姿勢不同,背景複雜,光線、天氣條件、視角、遮擋情況也不同。
比起這些容易造成混淆的因素,有些不同的物種,看上去并沒有那麼大的差别。
哪個類别的預測機率最高,圖像就分給哪個物種。
評估名額:分類器的logloss。
怎樣上手
拿到任務之後,要做的第一件事就是去看,以前有沒有類似的問題,前人方法能不能借鑒。
少年發現,比賽資料集和ImageNet有不少交集。
△ ImageNet資料集裡的一些栗子
那麼,怎樣利用它們之間的異同來改進現有的方法?
首先,本次任務裡的未知 (Unknown) ,和ImageNet是非常相似的。
是以,可以用遷移學習,拿CNN做初始化或者做固定特征提取器。
遷移學習論文:
https://arxiv.org/abs/1411.1792
一個差別在于圖像尺寸,ImageNet裡面的圖像都是224 x 224像素,而動物識别任務裡,圖像要更大一些。
是以,要改進算法來處理大圖。
熟悉問題之後,就先搭建一個簡單的pipeline:從加載資料集,到訓練,到驗證。可以疊代幾次。
怎樣防止過拟合
△ 可愛的過拟合
19,000張圖像裡面,有13,000張屬于訓練集,餘下6,000張是測試集。
資料集并不是很大,為了避免過拟合,少年做了以下幾種嘗試:
資料擴增
就是通過旋轉、翻轉、裁剪等這樣簡單的操作,把一幅圖變成幾幅。
這裡,用了transforms_side_on随機旋轉,翻轉,還調了光。
資料擴增論文:
http://cs231n.stanford.edu/reports/2017/pdfs/300.pdf
學習率
深度學習網絡裡,最重要的超參數就是學習率。
程式猿用的是lr_find的方法,是fastai庫裡面提供的,用來找最優值。
這個方法是Leslie Smith提出的:剛開始訓練的時候,學習率設得很低,然後給每個Batch的學習率做指數增長。
Smith論文在此:
https://arxiv.org/abs/1506.01186
訓練用的圖像尺寸是324 x 324,因為這些圖像在驗證集上表現比較好。
少年也嘗試了不同的批尺寸 (Batch Size),試到32的時候,GPU存儲到了上限。然後,他就為學習率做了相應的微調。
學習率vs批尺寸:
https://miguel-data-sc.github.io/2017-11-05-first/
擴大圖像尺寸
用小圖訓練幾個Epoch之後,就可以換大圖 (450 x 450) 再持續訓練幾個Epoch。
這也是防止過拟合的一種不錯的方式,在少年的logloss身上,産生了明顯療效。
各種模型合起來
少年訓練了各種模型,比如resnet50,resnext101_64,inception_4,restnet152以及restnext101。然後,把它們給出的結果用權重平均整合到一起,就獲得了榜首的高分。
哪些做法沒有用
一是,受到下面這個Kaggle核心的啟發,程式猿做了些圖像相關的統計資料 (Image Related Statistics) 。
但是,在把各種網絡結合在一起的時候,這些統計就減分了。
Kaggle Kernel傳送門:
https://www.kaggle.com/greenmtn/xgb-starter-lb-0-88232/code
二是,在瓶頸特征 (Bottleneck Features)上訓練邏輯回歸 (Logistic Regression) 。瓶頸特征,是進入全連接配接層之前,卷積層輸出的最後結果。
這個方法,在Kaggle狗狗品種識别挑戰賽裡,效果很好,但在這裡就不太行。
印度少年說,大家一定要嘗試從各種不同的角度來看問題,不要放棄。
雖然獎金沒多少……
HackerEarth是一個程式設計技能的線上評測系統,也舉辦過許多程式設計比賽。
雖然,有些比賽獎金并不豐厚。不過,據說比賽成績好的選手可能獲得名企的推薦資格。
原文釋出時間為:2018-09-4
本文作者:關注前沿科技
本文來自雲栖社群合作夥伴“
量子位”,了解相關資訊可以關注“
”。