在我們看來,計算機就是一台嚴絲合縫、精密運轉的機器,嚴格按照程式設計師下達的指令工作。雖然產品上線之後經常碰到迷之問題,但我們通常會檢討程式設計得不夠完美,而不會認為這是理所當然。因為我們相信只要程式設計嚴謹,將各種意外情況考慮在內,就會消除這種不確定問題。
然而到了機器學習,特別是深度學習,很多結果都是以概率的形式提供的。就拿分類來說,通常模型**出屬於每個類別的概率,而不是直接給出乙個確定的結果。這就如同天氣預報員預報明天的天氣:晴天的概率多少多少,下雨的概率多少多少。估計如果這樣預報天氣,很多人會抓狂。問題是,天氣預報說明天是晴天,明天就一定是晴天嗎?這其實仍然是乙個概率問題。雖然我們掌握了足夠的氣象資料,天氣預報也越來越準確,但是我們依然無法保證每次都是準確的。
既然在深度學習中分類問題是各類別的概率,我們很容易選擇一種策略:某個類別的概率最高,我們就認為**結果屬於哪種類別。比如下面這張蛙的:
使用cifar-10資料集訓練出的模型進行推斷,各個類別的概率如下:
其中,frog類別的概率最大,我們就認為這張所屬的類別為frog。
計算模型準確度的方法也非常簡單:
這種度量也稱之為rank-1準確度,這也是一種非常直觀的度量方式。然而,最近幾乎所有在imagenet資料集上評估的機器學習模型的**都不僅給出了rank-1準確度,還給出了rank-5準確度。
顧名思義,rank-5準確度選取5個最大概率的類別,只要這5個類別中的乙個和真實標籤相同,該**結果就為真。rank-5準確度的計算方法如下:
rank-1和rank-5的**實現也非常簡單:
def rank5_accuracy(preds, labels):
# initialize the rank-1 and rank-5 accuracies
rank1 = 0
rank5 = 0
# loop over the predictions and ground-truth labels
for (p, gt) in zip(preds, labels):
# sort the probabilities by their index in descending
# order so that the more confident guesses are at the
# front of the list
p = np.argsort(p)[::-1]
if gt in p[:5]:
rank5 += 1
if gt == p[0]:
rank1 +=1
# compute the final rank-1 and rank-5 accuracies
rank1 /= float(len(labels))
rank5 /= float(len(labels))
return (rank1, rank5)
有朋友可能會覺得,這個機器學習也太不靠譜了吧!不能給出乙個精確的結果也就算了,還給出5個模凌兩可的答案。在cifar-10這樣的小資料集上,因為總的類別很少,如果還統計rank-5準確率,的確有點傻,但是考慮到imagenet這樣超大規模的資料集,其類別有成千上萬個,特別是某些較小的類目,比如如下兩張:
普通人也很難分辨出其類別不同。所以在某些大型分類模型任務中,rank-5準確率可以提供乙個對rank-1準確率的乙個補充。
理想情況下,rank-1準確度將與rank-5準確度同步增加,但是在具有挑戰性的資料集上,情況並非總是如此。因此,我們還會檢查rank-5的準確度,以確保我們的網路在rank-1準確度停滯不前時仍然在「學習」。
往期回顧
站在巨人的肩膀上:遷移學習
使用資料增強技術提公升模型泛化能力
計算機視覺與深度學習,看這本書就夠了
聊一聊rank 1和rank 5準確度
在我們看來,計算機就是一台嚴絲合縫 精密運轉的機器,嚴格按照程式設計師下達的指令工作。雖然產品上線之後經常碰到迷之問題,但我們通常會檢討程式設計得不夠完美,而不會認為這是理所當然。因為我們相信只要程式設計嚴謹,將各種意外情況考慮在內,就會消除這種不確定問題。然而到了機器學習,特別是深度學習,很多結果...
No 1 聊一聊資料獲取和爬蟲
為什麼要把資料獲取 爬蟲放在一起來聊呢?居士是想成為一名資料科學家的!資料科學家就要具備很多的技能,什麼統計學 資料探勘 資料倉儲 大資料計算 資料視覺化等等。但是,首先我們要有資料,沒有資料我們玩什麼?想要玩資料,我們就要來聊一下資料獲取,資料獲取有很多途徑,爬蟲算是其中最自力更生的技能了,而實現...
聊一聊抽象類和介面
什麼是抽象類 乙個允許有抽象定義存在的類,可以像普通類一樣有屬性,成員方法,建構函式。只有方法的宣告,沒有方法的實現。也可以有預設的方法實現。怎樣定義抽象類訪問修飾符 abstract class 類名 抽象方法的作用為了約束當前方法都具有某種行為 注意 1.抽象類必須使用關鍵字宣告。2.抽象類不可...