在咱們看來,計算機就是一臺嚴絲合縫、精密運轉的機器,嚴格按照程序員下達的指令工做。雖然產品上線以後常常碰到迷之問題,但咱們一般會反省程序設計得不夠完美,而不會認爲這是理所固然。由於咱們相信只要程序設計嚴謹,將各類意外狀況考慮在內,就會消除這種不肯定問題。git
然而到了機器學習,特別是深度學習,不少結果都是以機率的形式提供的。就拿圖片分類來講,一般模型預測出圖片屬於每一個類別的機率,而不是直接給出一個肯定的結果。這就如同天氣預報員預報明天的天氣:晴天的機率多少多少,下雨的機率多少多少。估計若是這樣預報天氣,不少人會抓狂。問題是,天氣預報說明天是晴天,明天就必定是晴天嗎?這其實仍然是一個機率問題。雖然咱們掌握了足夠的氣象資料,天氣預報也愈來愈準確,可是咱們依然沒法保證每次都是準確的。程序員
既然在深度學習中分類問題是各種別的機率,咱們很容易選擇一種策略:某個類別的機率最高,咱們就認爲預測結果屬於哪一種類別。好比下面這張蛙的圖片:github
使用CIFAR-10數據集訓練出的模型進行推斷,各個類別的機率以下:bash
其中,Frog類別的機率最大,咱們就認爲這張圖片所屬的類別爲Frog。微信
計算模型準確度的方法也很是簡單:網絡
這種度量也稱之爲rank-1準確度,這也是一種很是直觀的度量方式。然而,最近幾乎全部在ImageNet數據集上評估的機器學習模型的論文都不只給出了rank-1準確度,還給出了rank-5準確度。機器學習
顧名思義,rank-5準確度選取5個最大機率的類別,只要這5個類別中的一個和真實標籤相同,該預測結果就爲真。rank-5準確度的計算方法以下:ide
rank-1和rank-5的代碼實現也很是簡單:oop
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這樣超大規模的數據集,其類別有成千上萬個,特別是某些較小的類目,好比以下兩張圖片:post
普通人也很難分辨出其類別不一樣。因此在某些大型圖片分類模型任務中,rank-5準確率能夠提供一個對rank-1準確率的一個補充。
理想狀況下,rank-1準確度將與rank-5準確度同步增長,可是在具備挑戰性的數據集上,狀況並不是老是如此。所以,咱們還會檢查rank-5的準確度,以確保咱們的網絡在rank-1準確度停滯不前時仍然在「學習」。
以上實例均有完整的代碼,點擊閱讀原文,跳轉到我在github上建的示例代碼。
另外,我在閱讀《Deep Learning for Computer Vision with Python》這本書,在微信公衆號後臺回覆「計算機視覺」關鍵字,能夠免費下載這本書的電子版。