umich cv-1

dyccyber發表於2023-09-23

UMICH CV Image Classification---KNN

在本節課中,首先justin老師為我們介紹了影像分類了基礎概念以及其用途,這裡就不多涉及了

接著我們思考影像分類問題,如果我們想要直接透過某種演算法來實現影像分類,顯然是比較棘手的,於是引入了機器學習的思想,即用資料驅動,用資料去訓練我們的分類器,再用新的影像來評估我們分類器的效能

然後介紹了幾個常見的用於影像分類的資料集,比如說MINIST,CIFAR100,CIFAR10,IMAGENET,Place365等等

接下來介紹了圖形分類中一種常用的演算法,也是我們作業中要去完成的演算法即Nearest Neighbor Classifier以及k-Nearest Neighbor Classifier

總體來說,我們大致需要兩步來完成這個演算法:
img
img
即第一步只是簡單的記憶來完成我們的訓練過程,第二步選擇綜合起來離預測影像最近的影像的label,作為我們的預測值
但是我們也可以發現這類方法的致命問題,那就是它的訓練時間要比預測時間短,即我們可能很快就可以完成我們模型的訓練,但是想要得出我們預測的結果需要很長時間,而這恰好與我們的理念是背道而馳的,我們不在乎要多少時間來訓練,而想要儘快的得到預測結果

同時在執行此類演算法時,有兩個引數很重要,一個是k值的選擇,即我們要綜合考慮幾個周圍的鄰居的距離來做出判斷,一個是我們要選擇什麼來作為距離的衡量方式

img
img

從上面這兩張圖可以看出k值與距離公式的選擇,對於分類尤其是決策邊界有著一定程度的影響

因此,如何選擇最合適的k值與距離公式,對於knn模型來說,是一個非常重要的問題
用更專業更普適的說法,就是如何去選擇我們模型的超引數:
img

接下來就是討論如何去設定超引數
img
首先第一種也是最直接的想法,我們只需要挑選在我們的資料集上表現最好的超引數
這種想法的問題就是會導致模型只在我們訓練的資料上表現好,一遇到新的資料表現就不行

第二種就是將資料劃分為訓練集與測試集,找出在測試集上表現最好的超引數,但是這種想法和第一種也是相同的問題,我們的測試集資料會對模型對超引數的判斷產生一定的汙染,因而在新的資料上表現也不佳

第三種就是我們劃分成train,validation與test三個資料集,用validation找出超引數,在test上測試,而這種的問題在於我們的test只能用一次,就是在找出超引數之後作為新資料測試,而如果我們經過很長的時間研究演算法,調整引數最後去測試發現效果不好,一切都前功盡棄了,所以這種方法實用性也不高

最好的方法就是採用交叉驗證
img
把資料集劃分成不同的fold,每個fold依次扮演validation或者test或者train的角色
但是缺點也很明顯,當資料量增大時,這種花費的時間顯然非常久,我們可以將這種方法應用於小資料集

最後對knn演算法的用途進行了討論
img
除了我們之前提到的,knn演算法的預測時間複雜度問題,其簡單地使用距離公式來進行分類,有時也會產生錯誤,比如上面這張圖,下方的四個圖片的距離值都是一樣的,但是顯然它們有著巨大的差別

所以直接使用knn演算法顯然是一個不好的選擇,但是我們可以在某些模型的某些步驟去應用knn演算法
img
如上圖所示,我們在ConvNet中對不同圖片的特徵向量使用knn進行分類,早最終的圖片分類效果較好

最後放一張總結圖:
img

ps:本次A1的作業比較簡單,主要引導學生初步學習pytorch,在knn實現中,強調了向量化程式設計的重要性,減少迴圈的使用,最後使用交叉驗證來尋找k值,這裡就不再詳細介紹具體實現。